【问题标题】:Making a DLL COM accessible使 DLL COM 可访问
【发布时间】:2010-07-27 18:20:26
【问题描述】:

我有一个用 .Net 编写的类库,我想将它提供给 VB6/VBA。我试过的没有用(显然我在问这个问题)。这是我所做的:

  1. 我在 Visual Studio 2010 Express 中创建了一个类库项目并将代码放入一个类模块中。
  2. 我打开项目属性并转到“程序集信息”并选中“使 COM 可见”。
  3. 我转到“高级编译”选项并定位到 .Net 2.0(这是非常简单的代码)。
  4. 然后我删除了所有对“系统”的引用。
  5. 我构建了项目(没有警告或错误)并将 DLL 从 Bin 文件夹复制到 C:\Windows\System32\
  6. 我运行 RegSvr32 注册 DLL 并得到错误:

模块“MyDll.dll”已加载,但未找到入口点 DLLRegisterServer。

确保“MyDll.dll 是有效的 DLL 或 OCX 文件,然后重试。

显然我的第一次尝试有点天真。有人可以提供指导吗?

【问题讨论】:

标签: .net vb.net com vb6 vb6-migration


【解决方案1】:

第 6 步是错误的。具有 [ComVisible] 类型的 .NET 程序集在 Regasm.exe 中注册。如果您不想将 DLL 安装到 GAC 中,请使用 /codebase 命令行选项。 /tlb 命令行选项创建类型库,您可以在 VB6 项目中使用它。

【讨论】:

  • 我对 regasm.exe 进行了文件搜索,但它似乎丢失了。这仅适用于完整版的 Visual Studio 吗? MS 是否提供下载(我仍在谷歌搜索,但我想你可能知道。)
  • 应该在 c:\windows\microsoft.net\framework\v4.0.30319 目录下。您缺少“Visual Studio 命令提示符”来简化此操作。但这是可以做到的。
  • 好的,我找到了 RegAsm 并使用了它。这创建了一个我可以参考的 tlb。当我在 VB6/VBA 中打开它时,所有的属性和方法都丢失了。通过阅读提供的其他一些链接,我推断我需要创建一个接口(我没有做的事情,我只是创建了类)。我仍在调整界面,但这是重要的一步。谢谢。
  • 接受了,因为这实际上让我到达了我需要去的地方。
【解决方案2】:

您需要为接口定义 GUID 并标记哪些类实现了哪些接口才能启动。 MSDN 有一个getting started guide。您不需要运行 RegSvr32,但您确实需要将 DLL 放在某处 where the app can find it:

使用 Regasm.exe 注册程序集后,您可以将其安装在全局程序集缓存中,以便可以从任何 COM 客户端激活它。如果程序集仅由单个应用程序激活,您可以将其放在该应用程序的目录中。

还有一个很好的全过程概览here。

【讨论】:

    【解决方案3】:

    我相当肯定 RegSvr32 仅适用于非 .NET DLL。 .NET 程序集存储在全局程序集缓存 (GAC) 中。您必须运行 gacutil.exe。

    【讨论】:

    • 没有必要将它们放入 GAC。使用/codebase 键重新充气就可以了。
    • @sharptooth:谢谢我不知道
    【解决方案4】:

    使用 GacUtil 代替 RegSvr32。 RegSvr 用于使用 VB6 制作的 dll,而对于 .NET DLL,您需要使用 GacUtil,因为它已添加到全局程序集缓存中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多