1
votes

I have created a simple class library project in visual studio 2008 that has one class as shown below. I am trying to get this class to register for COM interop so that I can use in via unmanaged scripts like vbscript or jscript.

In my project build properties I have checked the box that says "Register for COM Interop".

In the Assembly Settings I have checked "Make this assembly COM Visible" and I have confirmed that the [assembly: ComVisible(true)] attribute is present in the assembly.cs file.

Every time I build this project I get an error that reads "projectname.dll does not contain any types that can be registered for COM Interop. Also, I have not been able to successfully create an instance of class 1 using a vbscript. Does anyone know that this is not registering properly?

My vbscript fails to create activex object at this line... Set F = CreateObject("64BitCLTest.Class1").

Finally, how do I get VS to register this in the 64bit area of the registry instead of the 32 bit area so that 64bit processes can use it?

-- The Test Class--
namespace _64BitCLTest
{
    [Guid("BBAA06EF-CA4C-4fe2-97CD-9B1D85ADA656")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    [ProgId("64BitCLTest.Class1")]
    public class Class1
    {
        Class1()
        {
            // do nothing
        }

        public string Method1()
        {
            return "This is a return string from method 1";
        }

        public int Property1
        {
            get {return 777;}
        }
    }
}
2

2 Answers

2
votes

you need to mark the constructor public:

-- The Test Class--
namespace _64BitCLTest
{
    [Guid("BBAA06EF-CA4C-4fe2-97CD-9B1D85ADA656")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    [ProgId("64BitCLTest.Class1")]
    public class Class1
    {
        public Class1()
        {
            // do nothing
        }

        public string Method1()
        {
            return "This is a return string from method 1";
        }

        public int Property1
        {
            get {return 777;}
        }
    }
}
0
votes

There are two parts to this answer. The first, problem as consultutah said was that I did not have the constructor marked as public.

The second answer is that there is a bug (I believe) in VS2008 that causes assemblies to never be registered in the 64-bit section of the registry, even if the setup project is configured for a target platform of x64.

I installed VS2010, rebuilt the exact same project and ran the Install. The assembly registered perfectly and I was able to successfully access it through COM using a 64bit process. I still have not found a solution for this in VS2008.