【问题标题】:How to use an unmanaged COM DLL in C# without referencing如何在不引用的情况下在 C# 中使用非托管 COM DLL
【发布时间】:2012-02-13 04:29:57
【问题描述】:

我正在考虑用 C# 编写一个 DLL,作为其功能的一部分,它将利用第三方 DLL 中的方法。

使用 C++ 编写的第三方 COM DLL 在客户端计算机上注册为第三方应用程序的一部分。

现在,我可以在我的解决方案中包含(通过引用 tlb 文件)DLL 并毫无问题地与之交互。但是,DLL 名称(不是方法签名等)每年都会更改,作为第 3 方合并的某些版本控制的一部分。此外,我无法分发第 3 方 DLL(许可等)。

我基本上想要做的是在我的 DLL 中使用非托管 COM DLL,而不在我的解决方案中引用或包含 DLL。

我正在寻找一些针对此特定要求的好文章/示例。我已经看到很多通过文件名、托管 COM 等使用非托管 DLL,但这些不符合我想要实现的目标。

即使有人可以使用以下元素给我一个基本示例,这也是一个很好的起点:

【问题讨论】:

标签: c# dll com


【解决方案1】:

大多数 COM 服务器都支持后期绑定。非常类似于在 .NET 中使用反射。您将使用 Type.GetTypeFromProgID() 和 Activator.CreateInstance(Type) 来创建 COM 对象。后期绑定的主要缺点:

  • 您没有获得 IntelliSense
  • 您犯的任何错误都会产生运行时错误而不是编译错误
  • 速度要慢得多
  • C# 语法很痛苦,除非您可以使用 C# 版本 4 dynamic 关键字或使用 VB.NET 包装器
  • 调试器无法显示 COM 对象的属性。你只会看到一个不透明的 __ComObject

但优点是您不必在供应商更新 DLL 时重新运行 Tlbimp.exe。如果该更新中断,那么您将收到运行时错误,而不是编译器诊断。总是很痛苦。

【讨论】:

  • 谢谢,这正是我要找的。我尝试了以下代码:Type ObjectType = System.Type.GetTypeFromProgID("ThirdPartyDLL.Object"); object ThirdPartyDLLObject = System.Activator.CreateInstance(ObjectType);,它按预期生成了对象。我使用 Visual Studio 附带的 OLE/COM 对象查看器工具获得了 ProgID。
  • 顺便说一句,我发现创建的对象类型是“System.___ComObject”。
【解决方案2】:

互联网上有很多资源,这个blog post应该会给你一个很好的起点。

【讨论】:

  • 我读过这样的文章,但这并不是我的目标。我们不知道第 3 方 DLL 将安装在哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2013-04-28
  • 2012-02-29
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
相关资源
最近更新 更多