c# - 如何在不引用的情况下在 C# 中使用非托管 COM DLL

标签 c# dll com

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

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

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

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

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

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

最佳答案

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

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

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

关于c# - 如何在不引用的情况下在 C# 中使用非托管 COM DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8910390/

相关文章:

c# - 在 Entity Framework 中使用 UnitOfWork 和存储库模式

c# - 如何保护 ASP.NET Web 服务只允许相对路径调用?

asp.net - Azure Web角色可以实例化activeX组件吗?

c# - 通过 C# 和 SMO 检查和删除现有表

c# - 将 DataTable 中的列值从 byte[] 转换为 String

c++ - DirectXTK - 无法在 kernel32.dll 中找到过程入口点 CreateFile2

c++ - 在构建 dll 时,我需要在客户端的 header 中提供多少 parent 作为 __declspec(export)?

C++访问DLL加载

c++ - 获取 Audio Session 的音量级别

com - VBScript "Type Mismatch"问题与 "[in, out] BSTR * "参数