TLBIMP和AXIMP的不同结果

时间:2013-02-15 09:55:17

标签: c# com tlbimp

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

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

该方法的签名仍未改变为我改变的内容。

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

我哪里可以错?

感谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

  1. 首先通过运行regsvr.exe -u
  2. 取消注册旧的COM服务器
  3. 删除旧的DLL和TLB文件
  4. 更改IDL以添加新方法
  5. 为您更改的界面分配新的IID
  6. 为使用接口
  7. 的coclass分配新的CLSID
  8. 增加库版本
  9. 更改输出DLL的名称,包括名称
  10. 中的主要+次要版本
  11. 构建新的COM服务器
  12. 使用regsvr32.exe注册服务器
  13. 运行Tlbimp.exe以生成互操作库
  14. 删除对.NET项目中旧的互操作库的引用
  15. 使用添加引用+浏览添加新的互操作库
  16. 跳过任何这些步骤都可能会引发构建问题,注册表污染,DLL地狱以及全面糟糕的失败日,而无法完成任何工作。