首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ COM C#混合模式互操作

C++ COM C#混合模式互操作
EN

Stack Overflow用户
提问于 2009-12-16 17:06:45
回答 2查看 1.1K关注 0票数 2

我试图理解从非托管C#调用C++库实现的选项。

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

我从阅读MSDN和这个问题上的文章中了解到,创建一个“混合模式”dll可能是可能的,该dll允许本地C++代码调用C#库。

关于这种方法,我有几个问题:

  1. 我该怎么安排这个?我可以简单地更改现有COM/ATL项目的一些属性以允许使用C#模块吗?
  2. 这些混合模式调用与COM互操作调用在性能上有何不同?是否有可用于防止模块之间的转换或深度复制的通用字符串格式?
  3. 如果该dll是创建混合模式的,那么它是否仍然可以由其COM客户端以相同的方式进行接口/使用,或者它们是否需要知道混合模式?
  4. 当加载此COM对象时,CLR的包含会增加大量开销吗?

我是Windows开发的新手,所以如果问题陈述中有什么需要澄清或纠正的话,请评论。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-16 17:25:12

我该怎么安排这个?我可以简单地更改现有COM/ATL项目的一些属性以允许使用C#模块吗?

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

这些混合模式调用与COM互操作调用在性能上有何不同?是否有可用于防止模块之间的转换或深度复制的通用字符串格式?

混合模式调用将更快,因为它使用更快的调用约定,并且不像COM互操作那样进行任何封送处理(您要么使用固有的兼容类型,要么执行自己的显式转换)。

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

如果该dll是创建混合模式的,那么它是否仍然可以由其COM客户端以相同的方式进行接口/使用,或者它们是否需要知道混合模式?

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

当加载此COM对象时,CLR的包含会增加大量开销吗?

这取决于你用开销来定义什么。密码大小?运行时的惩罚?记忆足迹?

无论如何,加载CLR意味着您将得到所有GC和JIT机器。那可不便宜。也就是说,如果您最终需要调用托管代码,这是无法避免的--您必须将CLR加载到某个进程中才能做到这一点。COM Interop和混合模式C++/CLI程序集之间的惩罚不会有所不同。

票数 4
EN

Stack Overflow用户

发布于 2009-12-16 17:24:12

对于诸如字符串问题这样的细节,我不能说太多,因为我从来没有积极使用过这种方法。

但是,您可以很容易地从任何C#代码中使用任何COM接口,只要让VS向导为您创建一个代理,那么除了调用COM和.NET时始终具有的性能开销之外,它没有任何性能开销。

另一方面,您只需将C#程序集的ComVisibleAttribute设置为true (在VS中它是项目属性中的一个简单复选框),然后编译器将自动为您创建COM接口。同样,没有额外的性能损失。

哈哈!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1916118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档