【发布时间】:2010-10-22 18:10:09
【问题描述】:
初步:调用者是一个本机 EXE,它公开了一种“插件”架构。它旨在加载 DLL(按名称,指定为命令行 arg)。该 DLL 必须是本机的,并导出特定的函数签名。 EXE 是 C++,这不是太重要,因为 EXE 是一个黑盒(不能修改/重新编译)。原生DLL可以通过在所述DLL中完全实现原生解决方案来满足应用程序的需求。但是,要求是允许在 C# 中编码实际工作(从而将本机 DLL 转换为瘦包装器/网关)。这导致我有 3 个选项(如果有更多,请分享):
- 本机 DLL 加载内部使用 C# 类库的 C++/Cli DLL
- 本机 DLL 通过 CCW 与 C# COM 对象交互
- 本机 DLL 托管 CLR 并调用 C# 程序集
还有一个要求是,不仅本机 DLL 需要一种在 C# 上发送消息(调用函数)的方法,而且 C# 还需要能够在某些异常情况发生时向本机 DLL 触发事件/回调(而不是关闭并返回)。现在这最后一件事我不确定如何在第三个选项中处理,但这完全是另一个问题。
直截了当:性能。有关这些方法的任何信息(假设它们都满足要求)?根据我的调查,我的理解是 2 会比 1 有更多的开销,但我不是 100% 有信心,这就是我在这里的原因。至于3,我还没有任何信息。
因此,如果有人处理过这些问题(或知道另一个优雅的选择),请加入。
谢谢!
【问题讨论】:
-
我不知道性能,但1绝对是最简单的。性能影响可能取决于需要封送多少数据。有关需要从 EXE DLL 传输的数据量的任何信息?
-
通信主要是以频繁的小包(256字节+或-)的形式从Native到Managed。 Managed 与 Native 之间的通信很少见,而且数据包非常短。