【发布时间】:2020-09-10 19:28:10
【问题描述】:
我正在开发一个小型开源项目,该项目使用我无法分发(因此无法引用)的第三方 COM ActiveX Dll。有没有一种简单的方法可以在我的项目中使用这个 DLL 而无需引用它(System.Reflection 程序集似乎不适用于 COM/ActiveX)?还是应该使用 [DllImport] 将其视为非托管 dll ?
谢谢
【问题讨论】:
-
当你引用 COM 对象时,你只引用了一个 contract(接口、方法、guid 等)。合同通常位于 TypeLib 中(嵌入为资源或外部 .tlb 文件)。在 .NET 中,该合同通常由“Interop.BlahBlahLib.dll”表示。您可以使用此文件(仅 .NET 的合同表示)来交付您的项目,而无需 合同实施(COM 对象本身)。但我不确定这是什么意思?无论如何,没有人能够使用它。注意:如果你不想发送合同本身,没有办法,合同必须以某种方式存在
-
这就是我的想法,但似乎 COM dll 以某种方式嵌入到我的 dll 中,因为之后,即使我删除了 COM dll,应用程序仍然可以工作,而它显然不应该工作。有没有办法指定不嵌入 COM dll?注意:COM dll 是一个常见的 dll,任何对我的应用感兴趣的人都会在他们的机器上拥有它(否则他们不会寻找这种类型的应用)。
-
互操作文件/类型可以嵌入到您的程序集中,但不能嵌入 COM 程序集本身。
-
所以App仍然只能使用Interop文件,不再需要COM了吗?
-
术语很重要。您的 .NET 应用程序是一个 COM“客户端”,而您使用的 COM 对象是一个“服务器”。服务器未嵌入客户端,如果删除服务器,客户端将无法工作。当您说“COM dll 以某种方式嵌入”和“如果我删除 COM dll,该应用程序仍然有效”时,不确定您真正指的是什么。如果 COM dll 是操作系统的一部分,那么您的问题是什么?