我的工作是通过公开COM互操作一些.NET API的产物。 作为构建的一部分,我们为所有这些组件* .TLB文件,并提供它们作为一个单独的SDK包的一部分。 我们的客户可以安装在我们的产品上的SDK,并创建使用我们的COM API的应用程序。
我们是否需要船舶和注册与产品本身的* .TLB文件? 有没有在*在运行时需要.TLB的情况下,编码时对他们的第三方库被执行?
请解释它是如何工作的,如果你回答是的。 我看到了很多遍的是说,我必须提供并登记他们的网络评论,但我没有找到一个明确解释了为什么它应该做的事。 这让我怀疑,这是真的。
是的,这是可能的。 尤其是在.NET的情况下,你不应该忽略注册类型库,因为你无法预测客户端代码将如何使用您的服务器。
他们不是特别常见,但有两种情况:
当客户端代码调用您的[标记有ComVisible特性]方法和呼叫跨越公寓边界。 公寓是COM的概念,是一个有点模糊,你要明白STA和MTA线程之间的差异。 保持简单:当呼叫从另一个线程做公寓的边界通常是交叉的,从另一个进程或从另一台机器。 COM需要帮助弄清楚如何将调用的参数序列化为IPC包和需要知道的参数的类型。 有一个在COM没有反射的概念,因此它不能很容易地自动完成。 一个单独的DLL需要实现了代理和短截线,几乎总是从一个IDL文件生成的。 这很难在.NET中得的,你几乎总是使用便捷的第二种方式,利用Windows中内置的标准编组。 它使用一个类型库,找出参数类型是什么。 该Regasm.exe / TLB选项确保接口的代理/存根和类型库注册,以便标准编组可以找到库。
当你暴露在公众界面结构。 结构是在互操作场景很麻烦,他们有一个布局的高度依赖于编译器设置。 等效.NET属性是StructLayout.Pack。 在.NET在8固定的,但是客户端代码并不知道。 要访问一个结构,客户端代码必须使用IRecordInfo。 可以让它找出struct的每个字段位于内存中。 A型库提供了IRecordInfo所需要的信息。 这当然是最好的,以避免在结构完全.NET,很容易做到。
我面临的一个问题,而其注册使用的COM组件作为.TLB引用NET的DLL。
所以,你不需要注册.NET动态库(.TLB项目)。
我希望它会工作。