使用COM从c++代码封送c#结构体

Using COM to marshal a C# struct from C++ code

本文关键字:结构体 代码 COM c++ 使用      更新时间:2023-10-16

前段时间,我有一个c#程序需要调用c++ dll中的一些函数。为此我使用了pInvoke。我需要传递的一些数据是结构体。因此,我将使用pInvoke签名工具包来了解如何创建一个c#结构体,该结构体与c++函数通过引用获取的结构体等效。然后,我就可以把这些结构体传递给c++代码了。

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

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

有人知道怎么做吗?

您可以使用IDL在COM中传递结构,这可能会加速数据传输,也可能不会。有一个很好的机会,它会提高数据复制的速度,因为你有更少的往返,但如果你花很多时间在CLR方面的原因是因为它做额外的工作,而不仅仅是复制数据,优化数据传输本身并不能真正加快事情。

在这种情况下,您必须对两边(本机和CLR)都有分析结果,因为您几乎肯定会优化错误的东西。