使用COM从C ++代码编组C#结构

时间:2014-06-09 20:34:08

标签: c++ .net com marshalling

前一段时间,我有一个C#程序,需要在C ++ DLL中调用一些函数。我为此目的使用了pInvoke。我需要传递的一些数据是结构。因此,我将使用pInvoke Signature Toolkit来了解如何创建一个C#结构,该结构与C ++函数通过引用所采用的结构相同。然后,我能够将这些结构传递给C ++代码。

现在,我有相反的情况。我是C ++代码,我被交给了_com_ptr_t对象。这本质上是一个指向C#对象的指针。 C#对象实现了一个COM接口,其中包含get_Foo,set_Foo等属性,我可以使用它来从C#对象中提取值(通常,它们只是基本数据类型,如float,bool,int等)并填充它们进入我的C ++对应物。

这很好用,但有点慢。当我分析我的代码时,它会花费大量时间在“clr”中。所以,我希望找到一种更快的方法,我可以在COM接口中添加一个函数,将整个C#对象立即复制到C ++对应的结构中 - 有点像我用上面的pInvoke做的那样,除了我通过COM接口从C ++代码中提取数据,而不是通过pInvoke接口传递数据到C ++代码。

有人知道这样做的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用IDL在COM中传递structs,这可能会也可能不会加速数据传输。很有可能它会提高数据复制的速度,因为你的往返次数较少,但如果你在CLR方面花费大量时间的原因是因为它'除了复制数据之外还做了额外的工作,优化数据传输本身并不会真正加快问题。

这是你必须为双方(本机和CLR)分析结果的情况之一,因为你几乎可以保证优化错误的东西。