gpt4 book ai didi

.net - *.tlb 文件在运行时使用过吗?

转载 作者:行者123 更新时间:2023-12-02 07:57:12 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

关于.net - *.tlb 文件在运行时使用过吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14245692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com