将.NET程序集公开为COM 101

时间:2010-03-25 11:41:59

标签: .net com interop

我无法在COM中公开.NET程序集。似乎我必须缺少一些基本步骤,因为我认为我遵循了我发现的所有教程和文档以及常识,但仍然在我做的时候(在测试VBScript中):

Set o = CreateObject("MyLib.MyClass")

一直说无法创建对象。

以下是我所做的步骤:

  1. 我有一个简单的方法虚拟类,没有属性。
  2. 该类位于Visual Studio中“使程序集COM可见”勾选的类库中。
  3. 类库已签名。
  4. DLL通过 RegAsm.exe 注册 / codebase 参数(我不希望/无法将DLL添加到GAC)。
  5. 为了确定,我尝试将库复制到与测试VBScript相同的目录,但它没有帮助。

    编辑:我应该提到,如果我将DLL放入GAC,我可以在COM中实例化该类。

    编辑:已解决。我没有完整的解释,但最终我发现它是由使用:

    引起的

    %WINDIR%\ Microsoft.NET \框架\ V2.0.50727 \ RegAsm.exe

    而不是64位版本:

    %WINDIR%\ Microsoft.NET \ Framework64 \ V2.0.50727 \ RegAsm.exe

    我比较了两个RegAsm的生成的注册表项,它们是相同的。所以猜测他们生成的东西比注册表键还要多。

4 个答案:

答案 0 :(得分:2)

你应该添加几个属性:

for interface:

[Guid("4200ead6-8252-412c-8c7e-c3b586ac40d6")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]

上课:

[Guid("9f718717-bc09-48f1-8ab1-00fa3abf4147")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("MyLib.MyClass")]

答案 1 :(得分:2)

是的,这是在64位操作系统上设计的。许多COM组件都是进程内DLL,仅作为32位DLL提供。 64位程序无法加载任何32位代码。为了防止它们发生故障,注册表被虚拟化;不同的程序对注册表有不同的看法。

32位程序实际上可以看到HKLM \ Software \ Wow6432 \ Classes中的键。 64位程序查看常规键。这会自动避免COM服务器意外。

.NET服务器不同寻常之处在于它们可以在32位和64位模式下运行,JIT编译器负责这一点。您通常应该执行的是两个版本的Regasm.exe。 Framework文件夹中的一个将为32位程序注册服务器,Framework64文件夹中的一个将其注册为64位程序。

答案 2 :(得分:1)

您可以使用Microsoft Fusion Logger http://msdn.microsoft.com/en-us/library/e74a18c4.aspx找出装配无法加载(或调用时绑定)的原因。

答案 3 :(得分:0)

我没有完整的解释,但最终我发现它是由使用:

引起的
%windir%\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe

而不是64位版本:

%windir%\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe

我比较了两个RegAsm的生成的注册表项,它们是相同的。所以猜测他们生成的东西比注册表键还要多。