如何将对象列表从 C++ 传递到 C#?

Posted

技术标签:

【中文标题】如何将对象列表从 C++ 传递到 C#?【英文标题】:How to pass a list of objects from C++ to C#? 【发布时间】:2012-01-18 17:42:22 【问题描述】:

我的第一个问题:)

我正在使用一个用 C++ 编写的应用程序(游戏的地图编辑器),它的前端 UI 是用 C# 编写的。由于我是 C# 的新手,我正在尝试在 C++ 方面做尽可能多的事情。

我想从 C# 调用一个 C++ 函数,该函数将返回具有简单变量类型(int 和 string)的结构列表,以便我可以用它们填充 UI 中的列表框。这可能吗?我应该如何在 C# 中编写 dll 导入函数?

我已经尝试在这里搜索答案,但我只找到了关于如何将列表从 C# 传递到 C++ 的帖子。

C++ 代码:

struct PropData

PropData( const std::string aName, const int aId )

    myName = aName;
    myID = aId;


std::string myName;
int myID;
;

extern "C" _declspec(dllexport) std::vector<PropData> _stdcall GetPropData()

std::vector<PropData> myProps;

myProps.push_back( PropData("Bush", 0) );
myProps.push_back( PropData("Tree", 1) );
myProps.push_back( PropData("Rock", 2) );
myProps.push_back( PropData("Shroom", 3) );

return myProps;

C# 导入函数:

    [DllImport("MapEditor.dll")]
    static extern ??? GetPropData();

编辑:

在 Ed S 的帖子之后。我将 c++ 代码更改为 结构道具数据 PropData( const std::string aName, const int aId ) 我的名字 = 一个名字; 我的身份证=身份证;

    std::string myName;
    int myID;
;

extern "C" _declspec(dllexport) PropData* _stdcall GetPropData()

    std::vector<PropData> myProps;

    myProps.push_back( PropData("Bush", 0) );
    myProps.push_back( PropData("Tree", 1) );
    myProps.push_back( PropData("Rock", 2) );
    myProps.push_back( PropData("Shroom", 3) );

    return &myProps[0];

和 C# [DllImport("MapEditor.dll")] static extern PropData GetPropData();

    struct PropData
    
        string myName;
        int myID;
    

    private void GetPropDataFromEditor()
    
        List<PropData> myProps = GetPropData();
    

但这当然不会编译,因为 GetPropData() 不会返回任何转换为​​列表的内容。

非常感谢 Ed S. 让我走到这一步!

【问题讨论】:

【参考方案1】:

您将无法将 std::vector 编组到 C# 领域。你应该做的是返回一个数组。在面对互操作情况时,坚持基本类型会使事情变得简单得多。

std::vector 保证 &v[0] 指向第一个元素并且所有元素都连续存储,因此只需将数组传回即可。如果您坚持使用 C++ 接口(我认为您不是),您将不得不研究一些更复杂的机制,例如 COM。

【讨论】:

他不能也使用结构吗?当然,用一种语言做所有事情会更容易。如果前端是用 C# 编写的,那么应该可以用 C# 完成所有操作。 感谢您的快速回答,但我需要更多有关 C# 语法的帮助,因为我说我是该语言的新手(今天才开始),我什至不知道它可以处理指针。 @Ramhound:我不明白您将如何创建一个完全模仿std::vector 的C# 结构。这仅适用于 POD 类型。 @Cousken:嗯,你用PropData 对象填充向量这一事实很复杂,所以你也需要模仿它们。您也应该能够创建一个结构来模仿它。 Pinvoke.net 是一个很好的资源。 @Ed S.:我可以将 PropData 对象拆分为整数和字符串数组,然后将字符串拆分为字符数组...我今天上班时会尝试这样做。 Alternativley 我可以将该列表导出到 XML,然后在我的 C# UI 中读取它。

以上是关于如何将对象列表从 C++ 传递到 C#?的主要内容,如果未能解决你的问题,请参考以下文章

如何将结构数组从 c++ 传递到 c#?

将对象列表从 c# 传递到糟糕的 c++ win32 本机 dll 的最有效方法是啥?

如何安全地将字符串引用从 c# 传递到 c++?

如何使用 DLLImport 将字符串从 C# 传递到 C++(以及从 C++ 到 C#)?

如何将二维数组从 C# 传递到 C++?

如何将结构中的char *从c#传递到c++