Solved

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

Posted on 2008-10-03
2
1,040 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

Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

Question has a verified solution.

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

Suggested Solutions

IP addresses can be stored in a database in any of several ways.  These ways may vary based on the volume of the data.  I was dealing with quite a large amount of data for user authentication purpose, and needed a way to minimize the storage.   …
Welcome my friends to the second instalment and follow-up to our Minify and Concatenate Your Scripts and Stylesheets (http://www.experts-exchange.com/Programming/Languages/.NET/ASP.NET/A_4334-Minify-and-Concatenate-Your-Scripts-and-Stylesheets.html)…
Email security requires an ever evolving service that stays up to date with counter-evolving threats. The Email Laundry perform Research and Development to ensure their email security service evolves faster than cyber criminals. We apply our Threat…
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

840 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