Как передать список объектов с 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.