在vs 2010中引用com dlls的问题

时间:2012-03-26 08:58:13

标签: visual-studio-2010 com

我在vm中运行了32位版本的win7。我试图在我的.net项目中引用5个com dll(VB6)。这些dll(及其依赖项)已注册好,因为我可以原生使用它们,因为它们构成了另一个应用程序的一部分,并且该应用程序运行正常。

我尝试直接在vs中设置对其中任何一个的引用,我收到错误消息 - 库未注册(HRESULT异常:0x8002801D(TYPE_E_LIBNOTREGISTERED))。

但是,如果我设置对另一个com组件的引用(我不想引用但反过来引用这些库)我发现对这些com(我想要引用)的引用得到了正确设置对比我然后只需要删除ref到不需要的dll,一切似乎都很好。

如果我查看其中一个成功引用的组件的GUID和版本详细信息,它们看起来与错误表单标题中显示的GUID和版本相同,当我尝试设置引用失败时直接使用相同的组件。

BTW我试过修复VS安装无济于事

我想知道是否有人可以解释我做错了什么。

编辑:汉斯建议后的跟进

所以我跑了

tlbimp mylib.dll

并返回TI1006错误 - 输出将覆盖输入文件。因此,根据以下建议,我发布了

tlbimp mylib.dll /OUT:interop.mylib.dll

然后返回错误

TlbImp:警告TI3011:类型库导入器遇到了一个不是从IUnknown派生的接口:'_ HiddenInterface'。跳过该界面。 TlbImp:错误TI1033:在'ADODB,Version = 7.0.3300.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'中找不到类型'ADODB._Recordset_Deprecated'。引用的程序集和类型库之间可能不匹配。

但我不确定这是否是红鲱鱼,因为在成功引用不同的更高级别的dll时可以引用此lib。我尝试过一个不引用ADODB的dll,而且似乎使用tlbimp。所以,例如。

tlbimp myNONADODBlib.dll /OUT:interop.myNONADODBlib.dll

从命令行运行。但是

tlbimp myNONADODBlib.dll

仍然生成错误TI1006 - 输出文件将覆盖输入文件,我无法将其引用到我的.net项目中

编辑:

ADO和Win7 SP1似乎存在问题。 http://support.microsoft.com/kb/2517589这将解释我所获得的弃用错误消息(TI1033),但不是为什么VS无法为dll创建CCW我可以通过tlbimp手动创建CCW。

编辑(12/03/28 10:40):

所以我用建议的tlb重建了com dll。我现在可以成功运行

tlbimp mylib.dll

没有收到任何错误消息,似乎成功完成。但是,当我尝试在VS中添加对该dll的引用时,我仍然得到相同的原始错误消息(库未注册(来自HRESULT的异常:0x8002801D(TYPE_E_LIBNOTREGISTERED)))。我已检查注册表,注册看起来没问题,即它指向正确的路径 - 我想知道它是否是权限类型问题 - 但我正在以管理员身份运行vs。

编辑(12/03/28 10:15):

所以我最终创建了一个具有相同环境的新全新虚拟机 - 它运行正常。所以我不知道除了一些注册表损坏之外会发生什么事情!

很多thx

西蒙。

1 个答案:

答案 0 :(得分:0)

您需要使用REGTLIB.exe来注册DLL的类型库。

类型库注册与组件注册是分开的 - 类型库支持内省/类型资源管理器功能,并且通常不需要运行预编译的应用程序,尽管编译时可能需要它。