Я часто использую этот фрагмент, и он слишком громоздкий, чтобы объявлять новую переменную. Однако это тоже работает:
msclr::interop::marshal_as<std::string>(gcnew String(string_to_be_converted))
Еще один вариант, который работает для меня, это маленький шаблон. Он не только устраняет ошибку, обсуждаемую здесь, но и исправляет еще одну проблему, которая не работает с marshal_as, а именно то, что он не работает для ввода nullptr. Но на самом деле хорошим переводом c ++ для nullptr System :: String был бы .empty () std :: string (). Вот шаблон:
template<typename ToType, typename FromType>
inline ToType frum_cast(FromType s)
{
if (s == nullptr)
return ToType();
return msclr::interop::marshal_as<ToType>(s);
}