【问题标题】:Loading and using a type Library (.tlb) at runtime在运行时加载和使用类型库 (.tlb)
【发布时间】:2015-11-23 09:04:08
【问题描述】:

我有一个.tlb 文件,它通过COM 公开C# DLL 的功能。我希望在运行时加载这个.tlb 并在我的原生项目中使用这些函数。

虽然我可以使用LoadTypeLib 函数加载库,但我不确定返回的ITypeLib 如何帮助我使用.NET DLL 中的函数。使用常规的DLL,我可以将GetProcAddressDLL 句柄一起使用并获取函数地址,但我认为它不适用于类型库?

那么,应该如何处理呢?

【问题讨论】:

  • 您是否想在运行时执行此操作,例如如果您正在创建脚本语言绑定?还是您只想在编译时执行此操作并能够在运行时使用对象?
  • 我想看看是否存在tlb,然后使用其中的对象,即需要在运行时做出使用其中的COM对象的决定。我希望避免将#import 用于tlb,我认为这是使用它的标准方式。
  • 对,但是你需要使用不同的 COM 对象吗?稍后创建,或者您要使用的 COM 对象集在编译时是已知的?
  • COM 对象,我想你的意思是我用 .tlb 导出的 .NET 接口?如果是这样,是的,我在编译时就知道这些。我会在编译时知道函数名和接口名。
  • 然后我会使用#import - 这是迄今为止最简单的方法。如果您事先不知道类型,则只需要在运行时使用类型库。如果您只想检查 DLL 是否存在(例如,如果它是可选组件或单独许可的插件),那么您可以使用任何合理的方法来执行此操作,包括尝试创建对象并捕获任何异常。

标签: c++ dll com tlbimp


【解决方案1】:

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

一般情况下,TLB 只在编译时才需要,因此编译器可以知道对象的类型并生成正确的代码来调用它们。在运行时您不再需要它。

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

在运行时,不需要头文件,类型库也不需要。要根据是否安装有条件地使用对象,您执行此操作的方式与用于任何其他 DLL 的方式基本相同。 IE。您查看是否安装了 DLL,如果没有,则不要尝试使用 DLL 代码。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2021-06-19
    • 2013-04-03
    • 1970-01-01
    相关资源
    最近更新 更多