c# - 在 C# 中使用 COM dll

标签 c# c++ com dll wrapper

我们有 COM dll,它是用 C++ 编写的,并已被用 vb 6.0 编写的应用程序使用。我公司计划在 .Net 平台上编写更新版本的应用程序。

就性能而言,在C#项目中使用COM dll时,我应该从下面列出的3个选项中选择什么

  1. 只需添加 dll 作为 com 引用
  2. 使用 C++/Cli 编写包装器 dll
  3. 使用 TlbImp.exe 生成包装器 dll

或者还有其他选择吗?
谢谢。

最佳答案

用 C++/CLI 编写包装器并没有那么快,CLR 中的 COM 互操作编码器经过了大量优化。当您添加对 COM 服务器的引用时,它会从您创建的互操作库自动生成机器代码 stub 。 A 做了很多与异常相关的工作,这些工作非常隐蔽且很难自己完成。

它确保失败 HRESULT 正确转换为托管异常,并且托管异常不会泄漏到 COM 服务器代码中。当你这样做时,你的“让它快点”的决心会让你像这样偷工减料。现在你得到了一些快速但不可靠的东西。在非托管代码中获取托管异常非常难以诊断,所有上下文都已消失。

选项 1 和 3 是一回事。两者都生成互操作库,IDE 只需为您运行 Tlbimp 的等效项。

通常的指导在这里适用。先做简单的事情,互操作库非常简单。只有当您可以实际衡量性能问题并且有一个现实的想法时,才考虑做真正困难的事情。我从未见过有人认为 C++/CLI 包装器是必要的。

关于c# - 在 C# 中使用 COM dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4106289/

相关文章:

python - 使用 COM 连接到正在运行的 Visual Studio 2003 实例,构建并读取输出

c# - 存储刚好超过数组末尾的元素的地址

c# - 通用存储库包含和过滤

c++ - 如何使函数在C++中返回结构指针

c# - 从 C++ com 加载项调用 C#

c++ - 实现一个简单的 COM 对象

c# - 如何从外部程序集访问内部类?

c# - 在类内部时设置属性或字段?

c++ - STM32 的第一个项目,在 C++ 中使用 HAL

C++删除 map 中的指针