【问题标题】:Using COM dll in C#在 C# 中使用 COM dll
【发布时间】:2011-05-05 14:41:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# c++ com dll wrapper


    【解决方案1】:

    在 C++/CLI 中编写包装器可能不会更快,CLR 中的 COM 互操作编组器经过大量优化。当您添加对 COM 服务器的引用时,它会从您创建的互操作库中自动生成机器代码存根。 A 做了很多与异常相关的工作,这些工作非常不可见,而且很难自己做。

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

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

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

    【讨论】:

      【解决方案2】:

      选项 2 的性能更高,但性能并不高,尤其是考虑到 DLL 本身在 VB6 中。

      不确定选项 3 是否有效。

      我个人会使用选项 1,但只需将互操作保存在安全的地方,这样我就可以继续重复使用相同的互操作,而不是每次添加引用时都创建它。

      另一种选择是使用新的dynamic 功能和后期绑定(使用Activator 创建对象),但这绝对是性能较低的。

      【讨论】:

      • DLL 本身不在 VB6 中,但在用 VB6 编写的应用程序中使用
      【解决方案3】:

      由于组件使用 COM,因此最简单的方法是将其添加为参考并让 Visual Studio 构建代理。这对于 .net 代码将是非常严格和透明的。它的性能不会那么好,但很可能会满足您的需求。我会先做这个,因为它很简单,然后看看它的表现如何。

      如果组件不是 COM 组件,而只是一个标准的 c++ dll,那么其他两种方法可能是更好的选择。

      【讨论】:

        【解决方案4】:

        由于数据的编组,对 COM 的调用很慢。我的意思是慢,与不跨越托管或 COM 边界的调用相比。

        如果您需要在应用程序的性能关键部分对 COM 组件进行大量小调用,您可以使用 C++ 包装(并组合)它们。

        如果调用数量很少,或者它们不是性能关键(但不是所有调用都对性能关键?)我会简单地添加对 COM dll 的引用。

        总结 参考COM dll,测试性能。由于您从 VB6 迁移,您将获得巨大的性能提升(.Net 中的字符串处理速度非常快)。

        【讨论】:

          猜你喜欢
          • 2012-02-04
          • 1970-01-01
          • 1970-01-01
          • 2015-02-22
          • 2014-10-05
          • 2014-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多