Solved

Developing a strong named library in C# that meets ComVisibility requirements

Posted on 2008-10-03
2
1,035 Views
Last Modified: 2013-12-17
I have been trying to develop a library (DLL) in Visual Studio 2008 and C# that could be used by a PowerBuilder application that we have in-house at our organization. I've developed a simple library just to test the concept. I've successfully compiled the library, including checking "Sign the Assembly" with a strong name key file in the project properties. I then registered the assembly with the GAC utility (gacutil), and that was successful, too.

Now, when I attempt to use the assembly in a test app (also .NET), I get the following error:

"Invalid ServicedComponent-derived classes were found in the assembly.
(Classes must be public, concrete, have a public default constructor, and meet all other ComVisibility requirements)"

I've attached the entire code for the class library, but I can't figure out what about it doesn't meet ComVisibility requirements. It has a default constructor, it all the required methods and properties are public. What's missing?
using System;

using System.Collections.Generic;

using System.EnterpriseServices;

using System.Linq;

using System.Text;

[assembly: Description("Sample DLL application to test the viability of using a DLL CrewManager Interface")]
 

namespace NIIPCrewManager

{

    [Transaction(TransactionOption.RequiresNew)]

    public class CMJob : ServicedComponent

    {

        private string m_WorkRequestNumber = string.Empty;

        private string m_CrewManagerNumber = string.Empty;
 

        #region Constructors

        /// <summary>

        /// Constructor of this class without arguments.

        /// </summary>

        public CMJob()

        {

        }
 

        /// <summary>

        /// Constructor of this class with arguments.

        /// </summary>

        public CMJob(string p_WorkRequestNumber)

        {

            m_WorkRequestNumber = p_WorkRequestNumber;

        }

        #endregion
 

        #region PUBLIC PROPERTIES
 

        /// <summary>

        /// Gets / Sets the NIIP Work Request for the job.

        /// </summary>

        public string WorkRequestNumber

        {

            get { return m_WorkRequestNumber; }

            set { m_WorkRequestNumber = value; }

        }
 

        /// <summary>

        /// Gets / Sets the CrewManager Job Number for the job.

        /// </summary>

        public string CrewManagerNumber

        {

            get { return m_CrewManagerNumber; }

            set { m_CrewManagerNumber = value; }

        }
 

        #endregion
 

        #region PUBLIC METHODS
 

        /// <summary>

        /// Creates the CrewManager Job and returns the CrewManager Job Number.

        /// </summary>

        public string CreateCrewManagerJob()

        {

            CrewManagerNumber = "TST1234";
 

            return CrewManagerNumber;

        }
 

        /// <summary>

        /// Creates the CrewManager Job and returns the CrewManager Job Number.

        /// </summary>

        public string CreateCrewManagerJob(string p_WorkRequestNumber)

        {

            WorkRequestNumber = p_WorkRequestNumber;

            CrewManagerNumber = "TST1234";
 

            return CrewManagerNumber;

        }
 

        #endregion
 

    }

}

Open in new window

0
Comment
Question by:DanielBorson
2 Comments
 
LVL 19

Accepted Solution

by:
elimesika earned 250 total points
ID: 22642308
HI

Do the following

1) remove the class constructor that has a parameter (it should have just the default empty constructor)

2) Compile your project

3) in your test application , create the object , use the object property to set the value of WorkRequestNumber

You are not being able to call a constructor that has your parameters, but it's the price you pay to implement the ServicedComponent model.
0
 

Author Comment

by:DanielBorson
ID: 22764540
Thanks. We ended up re-doing this as a web service, but your answer makes perfect sense.
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

In my previous two articles we discussed Binary Serialization (http://www.experts-exchange.com/A_4362.html) and XML Serialization (http://www.experts-exchange.com/A_4425.html). In this article we will try to know more about SOAP (Simple Object Acces…
Wouldn’t it be nice if you could test whether an element is contained in an array by using a Contains method just like the one available on List objects? Wouldn’t it be good if you could write code like this? (CODE) In .NET 3.5, this is possible…
This video discusses moving either the default database or any database to a new volume.
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.

747 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now