请建议在 C# 和 C++ 之间传递数据的基础架构。
我在此项目中使用 P/invoke 在 C# 和 C++ 之间进行互操作。我想传递对称定义的数据结构。最好使用什么基础设施?协议缓冲区在这里有用吗?
I'm using P/invoke to interoperate between C# and C++ in this project. I'd like to pass data structures that are symmetrically defined. What's the best infrastructure to use? Could protocol buffers be useful here?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我建议使用 C++/CLI,因为您可以在两个世界中使用相同的头文件/定义文件。开发 C++ CLI 的主要目标之一是填补托管世界和非托管世界之间的空白。 这篇文章为您提供了更多优势。
在 MSDN 中有一个很好的描述 C++cli 的工作原理以及如何使用它。
另请参阅此处
I would suggest to use C++/CLI since you can use the same header files / definition files in both worlds. One of the main goals for developing C++ CLI was to fill the gap between the managed and the unamanaged world. This article gives you even more advantages.
In the MSDN there is a nice description how C++cli works and how you can use it.
see also here
如果可以的话,您可能想考虑使用 COM。定义 COM 可见且具有 InterfaceType ComInterfaceType.InterfaceIsDual 的 .NET 类,并使用 MarshalAs(UnmanagedType) 属性修饰每个参数,然后 C++ 应用程序可以封送可在托管代码和非托管代码之间传递的对象。
处理“对称定义”是因为接口是在 COM 中定义的,而且 COM 为您提供了比直接 P/Invoke 更多的错误处理和对正在发生的情况的可见性。
If it's an option, you may want to look into using COM. Define .NET classes that are COM visible and have the InterfaceType ComInterfaceType.InterfaceIsDual, and decorate each parameter with the MarshalAs(UnmanagedType) attribute, then the C++ app can marshal objects that can be passed between managed and unmanaged code.
The "Symmetrical definition" is handled because the interface is defined in COM, plus COM gives you a little more error handling and visibility into what is going on than straight P/Invoke.