Как лучше всего изменить программу на C ++ для использования с pInvoke из C # .NET CF?
У меня есть большая кодовая база C ++, которая широко использует STL. А именно, итераторы, контейнерные классы и стандартные строки.
Кроме того, многие легкие классы передаются по значению.
Я хочу создать графический интерфейс C # поверх этой кодовой базы для сенсорных устройств Windows Mobile.
Стоит ли это того?
Мне удалось получить несколько примеров работы с использованием pInvoke для вызова кода C ++ из C # .NET, но написание оболочек для каждой точки доступа и для всех возвращаемых типов STL кажется очень сложным и уродливым. Есть ли другой способ или я несколько чучела?
КСТАТИ. Управляемый C ++ недоступен, поскольку он не поддерживается ни в какой форме .NET CF.
- редактирование:
У меня есть один конкретный вопрос в отношении пинвока.
Предположим, у вас есть функция, возвращающая строку C ++ по значению
std::string foo () {
return std::string ("Hi");
}
Я понимаю, что невозможно вызвать эту функцию из C # с помощью pinvoke, потому что нет способа маршалировать строку STL, но моя проблема в том, что я даже не могу написать оболочку без выделения нового массива, потому что std :: string вернулся не в кучу.
char* foo2 () {
return foo().c_str(); //Very bad
//the returned pointer is released when the std::string falls out of scope.
//and will be invalid before the caller is able to do anything with it.
}
Итак, моя проблема в том, как обернуть foo в подходящий для pInvoke формат без необходимости перераспределения всей строки.
char* foo2 () {
std::string f = foo();
char* waste = new char[f.length()+1];
strcpy (waste, f.c_str());
return f;
}
Мысль о том, чтобы выполнить вышеизложенное для каждой точки, в которой мне нужно вернуть std :: string, достаточна, чтобы заставить меня отказаться от попытки использовать C #.