Преобразование управляемых типов C ++ / CLI в неуправляемые типы через границы сборки - PullRequest
2 голосов
/ 18 июля 2011

После написания некоторого 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, было бы распространенной проблемой, но после долгих поисков я не нашел много по этой теме.

Ответы [ 3 ]

2 голосов
/ 18 июля 2011

Поскольку эти функции нужны только при программировании в смешанном режиме, оберните их в некоторые файлы заголовков / статическую библиотеку вместо сборки.Таким образом, вы можете повторно использовать их в каждой программе, но вы не зависите от того, экспортируются ли они.

0 голосов
/ 18 июля 2011

Передача классов стандартной библиотеки C ++ между DLL всегда плохая новостьИзбегайте этого, если возможно.

0 голосов
/ 18 июля 2011

Не конкретный ответ на ваш вопрос, но у меня нет таких проблем, как ваша, с этими функциями преобразования:

        static void StringToStdString ( String ^ s, std::string& os ) 
        {
            using namespace Runtime::InteropServices; 
            const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
            os = chars;
            Marshal::FreeHGlobal(IntPtr((void*)chars));
        }

        static const char * StringToCharPtr ( String ^ s) 
        {
            using namespace Runtime::InteropServices; 
            const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
            return chars;
        }

        static String^ StdStringToString(const std::string& _is)
        {
            return gcnew String(_is.c_str());
        }
...