我正在研究一种通过COM互操作公开某些.NET API的产品。作为构建的一部分,我们为所有这些程序集生成* .tlb文件,并将它们作为单独SDK包的一部分提供。我们的客户可以在我们的产品上安装SDK,并创建使用我们的COM API的应用程序。
我们是否需要随产品本身发送和注册这些* .tlb文件?是否存在运行时需要* .tlb,执行针对它们编码的第三方库的情况?
如果您回答“是”,请说明它是如何工作的。我在互联网上看到很多评论说我必须提供并注册它们,但我没有找到一个清楚解释为什么要这样做的评论。这让我怀疑它是真的。
答案 0 :(得分:34)
是的,这是可能的。特别是在.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中完全避免使用结构当然是最好的。
答案 1 :(得分:0)
我在注册.Net dll时面临一个问题,它在COM组件中用作.tlb引用。
因此您无需注册.Net dll(.tlb项目)。
我希望它能奏效。