Как маршалировать карту, содержащую struct в качестве параметра intout / output, когда C # вызывает функцию из c ++? - PullRequest
0 голосов
/ 08 ноября 2019

Вот определение функции в 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^ и StringToHGlobalUni), но для структуры в карте я не могу найти никаких способов сделать это.

...