c# - C++ COM C# 混合模式互操作

标签 c# c++ com com-interop mixed-mode

我正在尝试了解从非托管 C++ 调用 C# 库实现的选项。

我的顶级模块是一个非托管 C++ COM/ATL dll。我想集成现有托管 C# dll 的功能。我已经并且可以重新编译这两个库的源代码。

我从阅读类似this overview这样的文章中了解到在 MSDN 和 this SO question可能可以创建一个“混合模式”dll,允许 native C++ 代码调用 C# 库。

我对这种方法有几个问题:

  1. 我该如何进行设置? 我可以简单地更改一些属性吗 在现有的 COM/ATL 项目上 允许使用 C# 模块吗?
  2. 这些混合模式调用将如何进行 性能与 COM 互操作不同 打电话?有没有共同的字符串 可用于防止的格式 之间的转换或深拷贝 模块?
  3. 如果创建了这个 dll 混合模式还可以吗 以相同的方式接口(interface)/使用 它的 COM 客户端,或者他们需要 知道混合模式吗?
  4. 纳入 CLR 是否会带来重大影响 加载此 COM 对象时的开销?

我是 Windows 开发新手,因此如果问题陈述中的任何内容需要澄清或更正,请发表评论。

提前致谢。

最佳答案

How do I go about setting this up? Can I simply change some properties on the existing COM/ATL project to allow use of the C# modules?

如果您完全控制该项目,那么更改此类设置不是问题,那么当然。您所需要做的就是为此项目启用 /clr (在项目属性中,打开“常规”页面,并查找“公共(public)语言运行时”支持)。现在,您可以根据需要在项目中使用托管句柄 (^) 和其他 C++/CLI 位。所有用纯 C++ 编写的现有代码都应该继续工作(现在将尽可能编译为 MSIL,但其语义将保持不变)。

How will these mixed-mode calls differ in performance from COM interop calls? Is there a common string format that may be used to prevent conversion or deep copies between the modules?

混合模式调用会更快,因为它使用更快的调用约定,并且不会像 COM 互操作那样进行任何编码(marshal)操作(您要么使用本质上兼容的类型,要么进行自己的显式转换)。

没有通用的字符串格式 - 问题是 System::String 既分配又拥有其缓冲区,并且还要求它是不可变的;因此您不能自己创建一个缓冲区,然后将其包装为 String,或者创建一个 String,然后将其用作输出文本的缓冲区。

If this dll is created mixed-mode, can it still be interfaced/used in the same way by its COM clients, or do they need to be mixed mode aware?

它可以进行相同的接口(interface),但如果它是通过 native 入口点输入的,它将尝试将 CLR 加载到进程中,除非已经加载了 CLR。如果调用客户端在调用之前已经加载了 CLR(或者客户端本身是从托管代码调用的),那么您将获得已加载的 CLR,这可能与您的代码所需的 CLR 不同(例如客户端可能已加载 1.1,而您的代码需要 2.0)。

Will inclusion of the CLR impose substantial overhead when loading this COM object?

这取决于您对开销的定义。代码大小?运行时惩罚?内存占用?

无论如何,加载 CLR 意味着您获得所有 GC 和 JIT 机制。这些并不便宜。也就是说,如果您最终需要调用托管代码,则没有办法解决这个问题 - 您必须将 CLR 加载到某个进程中才能执行此操作。 COM Interop 和混合模式 C++/CLI 程序集之间的惩罚不会有所不同。

关于c# - C++ COM C# 混合模式互操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1916118/

相关文章:

c# - 为什么 C# 不推断我的泛型类型?

c# - 将 Cookie 对象转换为字符串格式并返回

c++ - ATLComTime.h 是可再发行组件的一部分?

c++ - 为什么这种声明函数的方式在 C++ 中已过时?

c++ - 使用 glBufferData() 调整大小后 VBO 的大小不正确

c# - 在 C# 中获取 RichTextBox 的 ITextDocument

internet-explorer - 控制 IE 的程序能否检测到是否遇到 HTTP 30x 代码?

c# - asp.net从后面的代码播放声音文件

c# - 50GB HttpRuntime.Cache 持久化可能吗?

c++ - 关于 QCoreApplication 和 QProcess