MFC построен с использованием опции компилятора / clr - CString / System :: String преобразование - PullRequest
1 голос
/ 20 ноября 2008

У меня довольно большое приложение MFC, которое только что было перенесено с VS6.0 на VS2008. Это был довольно болезненный процесс, но теперь я хотел бы изучить возможные варианты управляемого кода. Я смог успешно построить проект, используя ключ / clr, который, кажется, дает мне доступ к управляемым типам.

Я хотел бы знать, является ли преобразование между System :: String и CString автоматическим или нет. Документация MSDN, которую я нашел, предполагает, что это преобразование не является автоматическим, но я не нашел, чтобы это имело место. Все три из приведенных ниже примеров работают, и оба, и 1, и 2 задокументированы MSDN. Что мне интересно, так это пример 3, который тоже работает, но я не знаю почему. Свойство CurrentDirectory возвращает указатель в управляемую кучу, String ^, но почему я могу назначить его CString? Что именно делает пример 3 и каковы последствия управления памятью?

Пример 1)

    marshal_context ^ context = gcnew marshal_context();
    String ^env = System::Environment::CurrentDirectory;
    const char* env2 = context->marshal_as(env);
    AfxMessageBox(env2);
    delete context;

Пример 2)

    CString s(System::Environment::CurrentDirectory);
    AfxMessageBox(s);

Пример 3)

    CString s = System::Environment::CurrentDirectory;
    AfxMessageBox(s);

Ответы [ 2 ]

3 голосов
/ 20 ноября 2008

Вариант 3 работает практически по той же причине, что и вариант 2. CString :: operator = перегружен для System :: String. Не забывайте, что оператор присваивания может сделать гораздо больше, чем просто скопировать ссылку.

Эта страница: Как: преобразовать между строковыми типами очень полезно для смешанных приложений. pin_ptr отлично.

Остерегайтесь разбрасывать управляемый код. Я также работаю над большим MFC-приложением, которое выходит / clr, и иногда мне хочется, чтобы мы делали это только в избранных библиотеках. Это может сделать отладку болезненной, когда в стеке вызовов есть много управляемых собственных переходов. Есть также соображения производительности .

1 голос
/ 20 ноября 2008

Вы можете перейти от system :: String к CString, потому что они имеют общее преобразование (lptstr?), Идущее к System :: String из CString, всегда будет нуждаться в System :: String ^ test = gcnew System :: String (CStringVar );

...