Почему я не могу ссылаться на методы в c # на управляемый код c ++, имеющий параметры std :: string?
Только типы POD могут автоматически маршалироваться назад и вперед между собственным и управляемымкод.std::string
не относится к типу POD.
Или, как преобразовать System :: String в QString?
#include <string>
#include <QString>
#include <msclr/marshal_cppstd.h>
QString SystemStringToQString(System::String^ str)
{
using namespace msclr::interop;
return QString::fromStdWString(marshal_as<std::wstring>(str));
}
EDIT (в ответ на комментарии к ответу # 6205169):
Предлагаемое исправление утечки памяти:
std::wstring MarshalString(String^ s)
{
using namespace System::Runtime::InteropServices;
std::wstring ret;
IntPtr p = Marshal::StringToHGlobalUni(s);
if (p.ToPointer())
{
ret.assign((wchar_t const*)p.ToPointer());
Marshal::FreeHGlobal(p);
}
return ret;
}
С точки зрения производительности, это гораздо менее эффективно, чем могло бы быть, но этодолжно работать и не должно течь.