【问题标题】:Exposing.NET assembly as COM 101将 .NET 程序集公开为 COM 101
【发布时间】:2011-01-31 16:28:26
【问题描述】:

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

Set o = CreateObject("MyLib.MyClass")

一直说无法创建对象。

以下是我已完成的步骤:

  1. 我有一个没有属性的简单单方法虚拟类。
  2. 该类位于一个类库中,该类库在 Visual Studio 中勾选了“使程序集 COM 可见”
  3. 类库已签名。
  4. DLL 是通过 RegAsm.exe 使用 /codebase 参数注册的(我不想/不能将 DLL 添加到 GAC)。

为了确定,我尝试将库复制到与测试 VBScript 相同的目录,但没有帮助。

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

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

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

而不是 64 位版本:

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

我比较了两个 RegAsm 生成的注册表项,它们是相同的。所以猜测它们生成的不是注册表项。

【问题讨论】:

  • 确切的错误是什么?堆栈跟踪是什么?我想知道它是否找到了您的 DLL(因为您使用了 /codebase 参数)但找不到其他依赖的 DLL。
  • 我打算调查错误详细信息,但在我这样做之前,我已经认为这是因为 AsmReg 的版本错误(请参阅下面的答案)。此外,它曾经在 GAC 中工作,并且该库确实有任何依赖项。所以问题最可能的根源似乎是一些注册问题。

标签: .net com interop


【解决方案1】:

你应该添加几个属性:

接口:

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

类:

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

【讨论】:

  • 感谢您的回复。我只是尝试过,但没有帮助。
  • 这些属性并不是绝对必要的,但拥有这些属性很不错,因为它们可以让您获得更多控制权。主要是确保程序集/类等具有 ComVisible(true) 属性。
【解决方案2】:

是的,这是在 64 位操作系统上设计的。很多 COM 组件是进程内 DLL,只能作为 32 位 DLL 使用。 64 位程序无法加载任何 32 位代码。为了防止它们发生故障,注册表被虚拟化;不同的程序有不同的注册表视图。

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      而不是 64 位版本:

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

      我比较了两个 RegAsm 生成的注册表项,它们是相同的。所以猜测它们生成的不是注册表项。

      【讨论】:

        猜你喜欢
        • 2014-12-20
        • 2010-09-26
        • 2012-07-04
        • 2010-11-03
        • 2013-12-22
        • 2017-01-23
        • 1970-01-01
        • 2011-05-01
        • 2012-03-01
        相关资源
        最近更新 更多