Если я правильно понимаю.Ваша самая большая задача - маршалинг строк из строк c ++ в объекты System :: String ^.
Что вы собираетесь сделать, это объявить метод в классе C ++ / CLI, который возвращает тип System :: String^ примерно так:
System::String^ get_str_from_cpp()
{
std::string str = ptr_to_native_cpp_class->get_str();
System::String^ ret_str = std_str2sys_str(str);
return ret_str;
}
Метод std_str2sys_str выглядит следующим образом.
static System::String^ std_str2sys_str(std::string std_str)
{
System::String^ sys_str = gcnew System::String(std_str.c_str());
return sys_str;
}
Конечно, вы можете использовать char * to, если хотите.
TheПеременная "ptr_to_native_cpp_class" должна быть переменной класса, которая указывает на экземпляр вашего нативного класса c ++.Похоже, у вас уже есть такие.
Есть также способы маршалинга из System :: String ^ в std :: string или char *, которые находятся в сети.Надеюсь, этот пример поможет.Вам не нужно беспокоиться о маршалинге базовых типов, таких как int или bools, вы можете просто вернуть их прямо из слоя C ++ / CLI в C #.
Чтобы ответить на вопрос о маршалинге структуры в C ++/ CLI;Я не думаю, что есть способ автоматически распределить всю пользовательскую структуру, даже если она полностью состоит из базовых типов.Что я делаю в своем коде, так это просто пишу объект-обертку, у которого есть определенные методы get для каждого элемента данных, например:
//Native C++ class
class data_container
{
public:
int var1;
int var2;
}
//C++/CLI class
public ref class cli_data_container
{
public:
get_var1() {return data_ptr->var1;}
get_var2() {return data_ptr->var2;}
private:
data_container* data_ptr;
};
Если есть автоматический способ сделать это, это было бы неплохо, но у нас былоПрошлым летом стажер сделал эти интерфейсы для нас для нескольких десятков служебных классов, и они выполнили свою работу.