如何在没有引用的情况下使用C#中的非托管COM DLL

本文关键字:DLL COM 情况下 引用 | 更新日期: 2023-09-27 18:20:52

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

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

现在,我可以在我的解决方案中包括(通过引用tlb文件)DLL,并与它交互,而不会有任何问题。然而,DLL名称(而不是方法签名等)每年都会发生变化,这是第三方引入的某些版本控制的一部分。此外,我不能分发第三方DLL(许可等)。

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

我正在寻找一些适合这个特定需求的好文章/例子。我见过很多按文件名、托管COM等使用非托管DLL的方法,但这些都不符合我想要实现的目标。

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

如何在没有引用的情况下使用C#中的非托管COM DLL

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

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

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

互联网上有很多资源,这篇博客文章应该会给你一个很好的起点。