Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

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

Posted on 2008-10-03
2
Medium Priority
?
1,052 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 750 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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In my previous article (http://www.experts-exchange.com/Programming/Languages/.NET/.NET_Framework_3.x/A_4362-Serialization-in-NET-1.html) we saw the basics of serialization and how types/objects can be serialized to Binary format. In this blog we wi…
Many of us here at EE write code. Many of us write exceptional code; just as many of us write exception-prone code. As we all should know, exceptions are a mechanism for handling errors which are typically out of our control. From database errors, t…
Is your data getting by on basic protection measures? In today’s climate of debilitating malware and ransomware—like WannaCry—that may not be enough. You need to establish more than basics, like a recovery plan that protects both data and endpoints.…
Look below the covers at a subform control , and the form that is inside it. Explore properties and see how easy it is to aggregate, get statistics, and synchronize results for your data. A Microsoft Access subform is used to show relevant calcul…

972 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