У меня довольно большое приложение 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);