将 C++ 对象传递给 C#
Posted
技术标签:
【中文标题】将 C++ 对象传递给 C#【英文标题】:Passing a C++ object to C# 【发布时间】:2012-10-18 05:33:39 【问题描述】:我有一个 C# 应用程序,它从 C++ 应用程序以文本形式接收序列化数据(数据是使用 BOOST 库在 C++ 中序列化的)现在序列化数据实际上是一个对象,我需要将其转换为类似的 .Net 对象.为了实现这一点,我被告知可以将 C++/CLI 组件编写为 dll,它可以反序列化文本数据(使用用于序列化它的相同库)并将其传递回 C# 应用程序。 我没有 C++/CLI 编程经验,但我在 C++ 编程方面没有任何问题。但我不认为 C++/CLI 很难掌握。我的问题是我没有得到关于如何创建 C++/CLI 应用程序将对象传递回 C# 的部分?任何提示、教程、链接将不胜感激
编辑正在发送的对象在 C++ 中是这样的
class person
public:
person()
person(int age) : age_(age)
int age() const
return age_;
private:
friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive &ar, const unsigned int version)
ar & age_;
int age_;
;
【问题讨论】:
您有多种选择。无论何种语言对其进行序列化,您始终可以在 c# 中反序列化对象。正如您所说的那样,它是文本,您应该可以很容易地在 c# 中做到这一点。对于二进制对象也可以这样做。请提供更多详细信息。 是的,它是文本。您能否提一些选项,我知道数据是使用 C++ 中的 BOOST 库序列化的。 【参考方案1】:您应该阅读命名空间 System.Runtime.InteropServices.Marshal
这是一篇关于如何将二进制数据 - 结构编组为 c# 结构的优秀文章。 http://www.codeproject.com/Articles/66243/Marshaling-with-C-Chapter-3-Marshaling-Compound-Ty
这是类型参考 - http://www.codeproject.com/Articles/66244/Marshaling-with-C-Chapter-2-Marshaling-Simple-Type
这称为编组,您可以使用 C# 读取结构或复杂类型中的二进制或文本数据。
您应该在这里考虑的几件事是结构的打包和对齐。谷歌搜索这些术语将产生非常有用的结果
【讨论】:
【参考方案2】:我可能是错的,但 XML 的全部意义不在于它独立于平台和语言吗?只要你收到 C# 类镜像 XML 文件中的数据结构 (即它有一个 int age_ 变量),使用 C# 中的普通 XML 文件解析器反序列化它应该不会有任何问题。 XML 文件是由 C++ 应用程序编写的这一事实并不比您手动编写更重要。
【讨论】:
以上是关于将 C++ 对象传递给 C#的主要内容,如果未能解决你的问题,请参考以下文章
Unity C# - 单击按钮将游戏对象传递给另一个 C# 脚本 [关闭]
将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
如何将 javascript 对象传递给 C# MVC 4 控制器