【问题标题】:Unmanaged to Managed options: performance considerations非托管到托管选项:性能注意事项
【发布时间】:2010-10-22 18:10:09
【问题描述】:

初步:调用者是一个本机 EXE,它公开了一种“插件”架构。它旨在加载 DLL(按名称,指定为命令行 arg)。该 DLL 必须是本机的,并导出特定的函数签名。 EXE 是 C++,这不是太重要,因为 EXE 是一个黑盒(不能修改/重新编译)。原生DLL可以通过在所述DLL中完全实现原生解决方案来满足应用程序的需求。但是,要求是允许在 C# 中编码实际工作(从而将本机 DLL 转换为瘦包装器/网关)。这导致我有 3 个选项(如果有更多,请分享):

  1. 本机 DLL 加载内部使用 C# 类库的 C++/Cli DLL
  2. 本机 DLL 通过 CCW 与 C# COM 对象交互
  3. 本机 DLL 托管 CLR 并调用 C# 程序集

还有一个要求是,不仅本机 DLL 需要一种在 C# 上发送消息(调用函数)的方法,而且 C# 还需要能够在某些异常情况发生时向本机 DLL 触发事件/回调(而不是关闭并返回)。现在这最后一件事我不确定如何在第三个选项中处理,但这完全是另一个问题。

直截了当:性能。有关这些方法的任何信息(假设它们都满足要求)?根据我的调查,我的理解是 2 会比 1 有更多的开销,但我不是 100% 有信心,这就是我在这里的原因。至于3,我还没有任何信息。

因此,如果有人处理过这些问题(或知道另一个优雅的选择),请加入。

谢谢!

【问题讨论】:

  • 我不知道性能,但1绝对是最简单的。性能影响可能取决于需要封送多少数据。有关需要从 EXE DLL 传输的数据量的任何信息?
  • 通信主要是以频繁的小包(256字节+或-)的形式从Native到Managed。 Managed 与 Native 之间的通信很少见,而且数据包非常短。

标签: c# c++-cli


【解决方案1】:

我之前已经完成了选项 1,并且相当成功。我不记得有任何显着的性能影响,尽管我的应用程序的性能并不十分密集。在我看来,如果出现性能问题,可能的罪魁祸首可能是频繁的、小的本地到托管的转换。是否可以在 C++/CLI 层对它们进行批处理?

【讨论】:

    猜你喜欢
    • 2013-06-04
    • 2010-09-24
    • 1970-01-01
    • 2018-03-19
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多