*.tlb文件是否曾在运行时使用过?

Den*_*nis 36 .net com

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

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

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

Han*_*ant 36

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

它们并不常见,但有两种情况:

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

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

  • Microsoft文档证实了这一点:http://msdn.microsoft.com/en-us/library/eaw10et3.aspx#marshaling_and_com_apartments"接受跨公寓编组的开销,这只有当跨越边界的呼叫很多时才会引起注意.您必须注册COM组件的类型库才能成功跨越公寓边界." (2认同)
  • http://msdn.microsoft.com/en-us/library/windows/desktop/ms692621(v=vs.85).aspx"使用MIDL为自定义接口生成代理和存根的替代方法,类型库可以是相反生成并提供系统,类型库驱动的封送引擎将封装接口." (2认同)