首页 > 解决方案 > 当 C# 从 C++ 调用函数时,如何编组包含结构作为输入/输出参数的映射?

问题描述

这是c ++中定义的函数:

struct StructDefineInCPlus
{
    const wchar_t* Type;
    const wchar_t* Value;
    const wchar_t* Data;
};

int GetWhatIWant(_Out_ std::map<const wchar_t*, StructDefineInCPlus>& parameter)
{
    parameter[key1].Type = L"Type1";
    parameter[key1].Value = L"Value1";
    parameter[key1].Data = L"Data1";

    parameter[key2].Type = L"Type2";
    parameter[key2].Value = L"Value2";
    parameter[key2].Data = L"Data2";
}

然后我有一个简单的 C++ 包装类,它定义如下:

struct StructDefineInWrapper
{
    const wchar_t* Type;
    const wchar_t* Value;
    const wchar_t* Data;
};

int GetWhatIWantWrapper(_Out_ std::map<const wchar_t*, StructDefineInWrapper>& parameter)
{
    return m_object->GetWhatIWant(parameter);
}

我试图将包装器中的结构定义为:

struct StructDefineInWrapper
{
    String^ Type;
    String^ Value;
    String^ Data;
};

但它有错误:a member of non-managed class cannot be a handle.

在 C# 中,我将其定义为:

 struct StructDefineInCSharp
 {
    public String Type;
    public String Value;
    public String Data;
 }

 var myMap = new Dictionary<string, StructDefineInCSharp>();

 wrapper.GetWhatIWantWrapper(myMap);

但它不断给我错误,例如无法将 c# 定义的映射转换为 C++ 映射。我以前从未研究过 C#,到目前为止,我只知道如何将 wstring 编组为输出参数(使用String^and StringToHGlobalUni),但是对于地图中的结构,我找不到任何方法来做到这一点。

标签: c#c++marshalling

解决方案


推荐阅读