2015-08-28 46 views
3

我有一个.tlb文件,该文件通过COM公开C#DLL的函数。我希望在运行时加载这个.tlb,并使用我的本地项目中的函数。在运行时加载和使用类型库(.tlb)

虽然我可以通过使用LoadTypeLib函数加载库,但我不确定ITypeLib返回如何帮助我使用.NET DLL中的函数。与常规DLL,我可以用GetProcAddressDLL手柄和获取函数的地址,但我不认为它会与类型库工作?

如何,那么,这应该接近?

+0

您是否想在运行时执行此操作,例如如果你正在创建一个脚本语言绑定?或者你只是想在编译时做到这一点,并能够在运行时使用对象? – Ben

+0

我希望看看是否存在'tlb',然后使用其中的对象,即需要在运行时决定使用其中的COM对象。我希望避免使用'#import'作为'tlb',我想这是使用它的标准方式。 – user1173240

+0

正确,但您是否需要使用不同的COM对象稍后创建,或者是编译时已知的COM对象集合? – Ben

回答

4

类型库不包含任何代码,它包含API和对象,函数和其它类型的由API暴露的描述。它可以描述一个标准的DLL及其函数,也可以描述COM对象,其中一些可以直接创建,其他可以从其他函数或对象中获得。但它只包含说明

一般来说,一个TLB只需要在编译时,所以编译器可以知道类型的对象,并生成正确的代码来调用它们。运行时不再需要它。

以这种方式,类似于一个头文件。实际上,使用#import实际上会自动生成一个头文件(查看您的构建目录以查看它),并且此头文件是编译应用程序实际所需的全部内容。因此,类型库(或多或少)等同于COM DLL的二进制格式头文件。

在运行时,不需要头文件,并且也不是类型库。要有条件地使用对象(取决于它们是否已安装),可以按照与其他任何DLL基本相同的方式执行此操作。即你看看是否安装了DLL,如果没有,你不会尝试使用DLL代码。

对于COM对象可以更简单。尝试创建其中一个对象,并且如果您使用REGDB_E_CLASSNOTREG失败,则表示DLL未安装(或未正确注册)。