2

我有一个 ActiveX COM 控件及其源代码。我想更改方法的输入参数之一,所以我更改了 IDL 等并生成了 COM DLL 和 TLB。

但是当我在 .NET 项目中导入 COM DLL 时,该方法保留了它的旧签名。所以我尝试使用 AXIMP 生成 ActiveX DLL(虽然都是一样的,但我想试一试)。

该方法的签名仍然没有更改为我更改的内容。

但是,当我使用生成的 TLB 文件中的 TLBIMP 生成互操作 DLL 时,方法签名正确更改。

我哪里错了?

谢谢。

4

1 回答 1

4

涉及许多手动步骤,因此很容易错过。这取决于您如何导入类型库,有不止一种方法可以做到这一点。如果您从 Add Reference + COM 选项卡中选择了引用,那么可能的错误是您忘记重新注册新的 COM 服务器。或者您不小心选择了旧的而不是新的,当您更改 guid 时可能会发生这种情况,就像您应该做的那样,忘记清理旧的。清理非常重要并且很容易被忽略,因为它需要在重建 COM 服务器之前完成。您最终可能会在注册表中得到很多垃圾。

是的,直接使用 Tlbimp.exe 是避免事故的最可靠方法。由于您直接在类型库上运行它并且根本不使用注册表。

尽可能减少麻烦的方法可能如下所示:

  1. 首先通过运行 regsvr.exe -u 取消注册旧的 COM 服务器
  2. 删除旧的 DLL 和 TLB 文件
  3. 更改 IDL 以添加新方法
  4. 为您更改的接口分配新的 IID
  5. 为使用接口的 coclass 分配一个新的 CLSID
  6. 增加库版本
  7. 更改输出DLL的名称,喜欢在名称中包含主要+次要版本
  8. 构建新的 COM 服务器
  9. 使用 regsvr32.exe 注册服务器
  10. 运行 Tlbimp.exe 以生成互操作库
  11. 删除对 .NET 项目中旧互操作库的引用
  12. 使用 Add Reference + Browse 添加新的互操作库

跳过这些步骤中的任何一个都可能引发构建问题、注册表污染、DLL Hell,并在没有完成任何事情的情况下度过一个糟糕透顶的一天。

于 2013-02-15T11:18:50.903 回答