Как передать список объектов из C ++ в C #? - PullRequest
7 голосов
/ 18 января 2012

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

Я работаю с приложением, написанным на 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) { myName = aName; myID = 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")] статический extern PropData GetPropData ();

    struct PropData
    {
        string myName;
        int myID;
    }

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

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

Большое спасибо, Эд С., за то, что ты так далеко зашёл!

1 Ответ

9 голосов
/ 18 января 2012

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

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

...