【问题标题】:Are *.tlb files ever used at runtime?*.tlb 文件是否曾经在运行时使用过?
【发布时间】:2012-12-24 02:50:37
【问题描述】:

我正在开发一种通过 COM 互操作公开一些 .NET API 的产品。作为构建的一部分,我们为所有此类程序集生成 *.tlb 文件,并将它们作为单独 SDK 包的一部分提供。我们的客户可以在我们的产品上安装 SDK 并创建使用我们的 COM API 的应用程序。

我们是否需要向产品本身发送和注册这些 *.tlb 文件?是否存在在运行时需要 *.tlb 时执行针对它们编码的第三方库的情况?

如果您回答是,请解释它是如何工作的。我在互联网上看到很多 cmets 说我必须交付并注册它们,但我没有找到一个清楚地解释为什么应该这样做。这让我怀疑这是真的。

【问题讨论】:

    标签: .net com


    【解决方案1】:

    是的,这是可能的。特别是在 .NET 的情况下,您不应忽略注册类型库,因为您无法预测客户端代码将如何使用您的服务器。

    它们不是特别常见,但有两种情况:

    • 当客户端代码调用您的 [ComVisible] 方法并且调用跨越公寓边界时。公寓是一个有点模糊的 COM 概念,您必须了解 STA 和 MTA 线程之间的区别。保持简单:当从另一个线程、另一个进程或另一台机器进行调用时,通常会跨越单元边界。 COM 需要帮助来确定如何将调用的参数序列化为 IPC 数据包,这需要知道参数的类型。 COM 中没有反射的概念,因此不能轻易地自动完成。需要一个单独的 DLL 来实现代理和存根,几乎总是从 IDL 文件生成。这在 .NET 中很难实现,您几乎总是使用方便的第二种方式,即使用 Windows 中内置的标准编组器。它使用类型库来找出参数类型是什么。 Regasm.exe /tlb 选项确保接口代理/存根和类型库已注册,以便标准编组器可以找到该库。

    • 当您在公共接口中公开结构时。结构在互操作场景中非常麻烦,它们的布局高度依赖于编译器设置。等效的 .NET 属性是 StructLayout.Pack。在 .NET 中固定为 8,但客户端代码不知道这一点。要访问结构,客户端代码必须使用 IRecordInfo。这让它可以找出结构的每个字段在内存中的位置。类型库提供了 IRecordInfo 需要的信息。最好完全避免在 .NET 中轻松完成结构。

    【讨论】:

    • 谢谢你,这正是我想要的。
    • Microsoft 文档证实了这一点:msdn.microsoft.com/en-us/library/…“接受跨公寓封送处理的开销,这仅在有许多跨边界调用时才明显。您必须注册 COM 组件的类型库,调用才能成功跨越公寓边界。”
    • msdn.microsoft.com/en-us/library/windows/desktop/… “作为使用 MIDL 为自定义接口生成代理和存根的替代方法,可以生成类型库,系统提供的类型库驱动的编组引擎将编组接口。 ”
    【解决方案2】:

    我在将 COM 组件中使用的 .Net dll 注册为 .tlb 引用时遇到问题。

    所以你不需要注册.Net dll(.tlb 项目)。

    我希望它会起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      相关资源
      最近更新 更多