将 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 控制器

如何将 C# 对象作为参数传递给 Javascript 函数

c++ 在创建时将构造函数参数从父对象传递给子对象

将 QObject 指针从 QML 对象传递给 C++