40

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

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

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

4

2 回答 2

41

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

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

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

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

于 2013-01-09T21:19:20.983 回答
0

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

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

我希望它会奏效。

于 2017-08-21T15:30:48.647 回答