После написания некоторого C ++ / CLI для упаковки существующей неуправляемой библиотеки C ++ возникла проблема преобразования управляемых типов в неуправляемые типы. Простым примером этого является преобразование std :: string в System :: String, но этот принцип применим ко многим типам, т.е. массиву -> вектору. Написав некоторую функцию преобразования, я решил упаковать их в сборку, чтобы я мог использовать их повторно. Учитывая, что глобальные функции C ++ / CLI не видны вне текущей сборки, я получил такие вещи, как это
public ref class ClassJustToContainStaticFunctions
{
public:
static std::string convert( System::String^ s )
{
msclr::interop::marshal_context context;
return( context.marshal_as<std::string>( s ) );
}
};
Это соответствует требованиям, но функция преобразования не становится общедоступной вне сборки, поскольку она использует неуправляемый тип в сигнатуре, подробнее см. Здесь http://msdn.microsoft.com/en-us/library/ms235607%28v=VS.100%29.aspx. Решение обычно добавить
#pragma make_public(std::string)
в файл, и я сделал это в других ситуациях без проблем. Однако make_public не работает для шаблонных классов, таких как std :: string. Смотрите здесь http://msdn.microsoft.com/en-us/library/ms235343%28v=vs.80%29.aspx для получения дополнительной информации.
Например, я нашел несколько попыток обойти, но все они казались довольно уродливыми.
Итак, после всего этого мой вопрос: я что-то упускаю здесь очевидное? Мне кажется, что преобразование из управляемых в неуправляемые типы, особенно для таких вещей, как контейнерные классы, то есть STL.NET <-> Неуправляемый STL, было бы распространенной проблемой, но после долгих поисков я не нашел много по этой теме.