创建并注册C#COM Dll

时间:2018-08-20 08:59:55

标签: c# com

我正在尝试学习如何使用VS2017 C#创建和注册COM DLL。 为此,我编写了测试代码:

using System;
using System.Runtime.InteropServices;


namespace ComObject1
{
    [ProgId("ComObject1.ClassExample")]
    [Guid("e514c7d2-ed6d-44c6-a7e2-36a272a8ba76")]
    [ComVisible(true)]
    public class ClassExample
    {
        [ComVisible(true)]
        public string Mystring()
        {

            return "Hello, world!";
        }
    }
}

然后,我在regasm.exe中注册了我的DLL,并尝试在Excel中使用它:

Sub Test()

Dim testClass As New COM_Dll.ClassExample
Dim Res As String
Res = testClass.Mystring()    

End Sub 

很难过,但我有运行时

  

错误429(Activex组件无法创建对象)。

...因此,Excel“无法看到” Mystring()方法。我做错了什么? 附言当我将DLL作为类库(不是COM)添加到C#应用程序时,它可以正常工作:

 var c = new ComObject1.ClassExample();
    Console.WriteLine(c.Mystring());

现在,我(通过另一本手册)稍微更改了代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace COM_Dll
{
    [ComVisible(true)]
    [Guid("4945B34B-1B63-4a58-B5FE-9627FEFAEA9D")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IInterface01
    {       
        string Mystring(string s);

    }

    [ComVisible(true)] 
    [Guid("36E6BC94-308C-4952-84E6-109041990EF7")]
    [ProgId("COM_Dll.CSCOMClass01")]
    [ClassInterface(ClassInterfaceType.None)]
    public class CSCOMClass01 : IInterface01
    {                

        public string Mystring(string s)
        {
            return "test";
        }

    }
}

现在,我可以在EXCEL中添加方法Mystring(),但是如果运行宏,仍然会出现“错误429(Activex组件无法创建对象)”。

enter image description here

1 个答案:

答案 0 :(得分:0)

问题与名称空间冲突。如果注册COM Dll,则应确信没有名称空间/类/签名冲突。如果使用“注册COM互操作注册”选项构建Dll,请务必小心-因为测试构建可能会在注册表中留下“垃圾箱”。