我有一个.tlb
文件,该文件通过COM
公开了C#
DLL
的功能。我希望在运行时加载此.tlb
并使用我的本机项目中的函数。
虽然我可以使用LoadTypeLib
函数加载库,但我不确定返回的ITypeLib
如何帮助我使用.NET DLL
中的函数。通过常规DLL
,我可以将GetProcAddress
与DLL
句柄一起使用并获取函数地址,但我不认为它可以使用类型库?
那么应该如何处理这个问题呢?
答案 0 :(得分:5)
类型库不包含任何代码,它包含API的描述以及该API公开的对象,函数和其他类型。它可以描述标准DLL及其功能,它还可以描述COM对象,其中一些可以直接创建,另一些可以从其他函数或对象获得。但它只包含描述。
通常,TLB仅在编译时需要,因此编译器可以知道对象的类型并生成正确的代码来调用它们。在运行时你不再需要它了。
以这种方式,它类似于头文件。实际上,使用#import
实际上会自动生成一个头文件(查看构建目录以查看它),这个头文件就是编译应用程序所需的全部内容。因此,类型库(或多或少)等效于COM DLL的二进制格式头文件。
在运行时,不需要头文件,也不是类型库。要有条件地使用对象取决于它们是否已安装,您可以使用与任何其他DLL基本相同的方式执行此操作。即你看看是否安装了DLL,如果没有,你不会尝试使用DLL代码。
对于COM对象,它可以更简单。尝试创建其中一个对象,如果您使用REGDB_E_CLASSNOTREG
失败,则表示未安装DLL(或未正确注册)。