从C#调用.TLB COM库

时间:2014-02-28 14:53:13

标签: c# dll import com typelib

我有一个旧的.TLB文件,名为'GrpSvr.tlb',它包含一个名为GrpCall的类。我已经使用regtlibv12.exe在我的Win7 x64机器上注册了.tlb,它正常工作。我想用C#调用这个库的方法,所以首先我尝试了:

Type objectType = System.Type.GetTypeFromProgID("GrpSvr.GrpCall"); 
dynamic thirdPartyDLLObject = System.Activator.CreateInstance(objectType);

但这会为null返回objectType

问题1.我可以这样调用我的.TLB文件吗?在这种情况下,我做错了什么?

离开这种方法后,我决定关注

Import TLB into C#

描述了如何使用MSs Type Library Importer创建C#DLL。我按照此操作使用以下命令从GrouperServer.dll创建了GrpSrv.tlb

  

C:\ Program Files(x86)\ Microsoft Visual Studio 12.0> tlbimp F:\ Groupers \ DRGROUP \ GrpSvr.tlb /out:C:\GrouperServer.dll / nam   协商:GrouperServer   Microsoft(R).NET Framework类型库到程序集转换器4.0.30319.33440   版权所有(C)Microsoft Corporation。保留所有权利。

     

TlbImp:导入到C:\ GrouperServer.dll的类型库

然后我将此DLL导入到我的C#项目中(并在this answer之后设置Embed interop Types = false)并尝试通过

调用该类
GrouperServer.GrpCallClass grouperServer = new GrouperServer.GrpCallClass();

但这不起作用,在运行时我收到以下错误:

  

DrGroupIN.exe中出现'System.Runtime.InteropServices.COMException'类型的第一次机会异常

     

附加信息:由于以下错误,检索具有CLSID {FFB54BC4-B15E-11D1-99BC-0000E803C444}的组件的COM类工厂失败:80040154未注册类(HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG))。

遵循

中给出的建议

Retrieving the COM class factory for component with CLSID {XXXX} failed due to the following error: 80040154

然后我将项目设置为目标x86,但在这种情况下这没有用。

问题2:为什么会抛出此错误,我该如何解决?

2 个答案:

答案 0 :(得分:3)

是的,你做错了。类型库是COM服务器,使用regtlibv12.exe是绝对必要的。您需要阅读它试图告诉您的异常,因为成千上万的Google点击,COM服务器没有注册。

COM服务器是可执行代码,通常存储在.dll中。有时是.ocx或.exe。注册该文件需要安装步骤,以便当程序尝试创建服务器实现的COM对象时,COM可以稍后找回它。 Regsvr32.exe实用程序是一种非常常见的方法,但您应始终使用供应商或作者提供的安装程序。这确保将可执行文件复制到您的计算机上并写入注册表项。包括类型库的那些。该异常告诉您这没有完成,COM无法找到告诉它存储文件的位置的注册表项。

.tlb文件只描述COM组件,它告诉编译器声明是什么样的。帮助编译器生成正确的代码以使用该组件并告诉您代码何时出错。它是元数据,非常类似于.NET程序集中存在的元数据,它描述了程序集实现的.NET类型。它通常作为资源嵌入在DLL或EXE中,就像元数据嵌入在.NET程序集中一样。您可以使用OleView.exe,File + View Typelib查看它。 Tlbimp.exe也是一个.NET实用程序,它将类型库转换为.NET互操作程序集,将声明转换为CLR可以轻松理解的格式。

无法帮助您找到正确的安装程序,它没有任何标准。

答案 1 :(得分:1)

将GrpSvr.Dll及其依赖项放在exe文件夹下,然后重试。该错误是因为它无法根据注册表中的GUID找到GrpSvr.Dll。

或者您可以使用该GUID搜索注册表,您将找到指定DLL所在位置的条目。

调试此类错误的一个工具是系统内部工具包中的进程监视器,日志将为您提供有关exe如何搜索注册表和文件的详细信息,从日志中,您应该找到缺少的部分。< / p>