0

我有一个用未管理的 C++ 编写的 COM DLL,并使用 VS 2010 编译。我可以使用 regsvr32 注册 DLL,并且可以通过 VBscript 调用它。

当我尝试添加对它的引用时,在创建 C# 客户端时,我没有看到添加引用 -> COM 选项卡中列出的 COM 对象。如果我手动浏览到 DLL 并尝试选择它,它会说 DLL 不是有效的 assmlby 或 COM 组件。

现在,我可以使用 tlbimp 工具生成一个互操作 DLL,并使用它作为对我的 C# 客户端的引用。一切正常。

我的问题是:

  1. 为什么通过 regsvr32 注册的原始 COM 未在添加引用对话框的 COM 选项卡中列出?
  2. 当我可以从 VBScript 和 C++ 本机代码调用它时,为什么 VS IDE 认为它不是一个有效的 COM?
  3. tlbimp 到底做了哪些 IDE 不能做的事情?
  4. 我需要进一步阅读什么来提高我对类型库和互操作性的理解?
4

1 回答 1

2

看起来像一个类型库问题——您的 COM 类可能已正确注册,但您的类型库可能没有。也许您忘记从 DllRegisterServer 函数中调用 RegisterTypeLib?

参考您的问题:

  1. 该对话框查找已注册的类型库,而不是 COM 类

  2. VBscript 调用 IDispatch 并且不关心类型库。tlbimp 不关心 IDispatch 并且需要一个类型库

  3. 您将 DLL 名称传递给 tlbimp——因此 tlbimp 知道如何获取类型库。相反,VS 是指缺少适当注册数据的注册表

于 2012-07-27T16:29:18.170 回答