Как передать список объектов с C++ на C#?

мой первый вопрос здесь :)

Я работаю с приложением, написанным на C++ (редактор карт для игры), который имеет интерфейс интерфейса, написанный на C#. Так как я новичок в C# я пытаюсь сделать как можно больше на C++ сторону.

из C# я хочу вызвать функцию C++, которая вернет список структур с простыми типами переменных (int и string), чтобы я мог заполнить ими список, который у меня есть в пользовательском интерфейсе. Возможно ли это? Как написать импорт dll функции в C#?

Я попытался найти здесь ответ, но я нашел только сообщение о том, как передать списки с 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();

EDIT:

после сообщения от Ed S. Я изменил код c++ на struct PropData { PropData (const std:: string aName, const int aId ) { моеимя = аимя; myID = помощь; }

    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# to [DllImport ("MapEditor.файл DLL")] static extern PropData GetPropData ();

    struct PropData
    {
        string myName;
        int myID;
    }

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

но, конечно, это не компилируется как GetPropData () не возвращает ничего, что переводится в список.

большое спасибо Эд С. за то, что довел меня до этого!

1 ответов


вы не сможете Маршалл std::vector на территорию C#. Вместо этого вы должны вернуть массив. Прилипание к основным типам делает вещи намного более простыми при столкновении с ситуациями взаимодействия.

std::vector гарантирует, что &v[0] указывает на первый элемент и что все элементы хранятся смежно, поэтому просто передайте массив обратно. Если вы застряли с интерфейсом C++, как он есть (что я не думаю, что вы), вам придется взглянуть на некоторые более сложные механизм, как COM.