Visual studio 2008 使用/clr编译器选项-CString/System::String转换生成MFC

Visual studio 2008 使用/clr编译器选项-CString/System::String转换生成MFC,visual-studio-2008,.net-3.5,mfc,clr,Visual Studio 2008,.net 3.5,Mfc,Clr,我有一个相当大的MFC应用程序,它刚刚从VS6.0迁移到VS2008。这是一个相当痛苦的过程,但现在我想探索任何可用的托管代码选项。我能够使用/clr开关成功地构建项目,该开关似乎使我能够访问托管类型 我想知道System::String和CString之间的转换是否是自动的。我发现的MSDN文档表明这种转换不是自动的,但我还没有发现这种情况。以下所有三个示例都有效,1和2均由MSDN记录。我好奇的是例子3,它也能起作用,但我不知道为什么。CurrentDirectory属性正在将指针返回到托管

我有一个相当大的MFC应用程序,它刚刚从VS6.0迁移到VS2008。这是一个相当痛苦的过程,但现在我想探索任何可用的托管代码选项。我能够使用/clr开关成功地构建项目,该开关似乎使我能够访问托管类型

我想知道System::String和CString之间的转换是否是自动的。我发现的MSDN文档表明这种转换不是自动的,但我还没有发现这种情况。以下所有三个示例都有效,1和2均由MSDN记录。我好奇的是例子3,它也能起作用,但我不知道为什么。CurrentDirectory属性正在将指针返回到托管堆,字符串^,但是为什么我能够将其分配给CString?示例3到底在做什么?内存管理的含义是什么

例1)

封送上下文^context=gcnew封送上下文(); 字符串^env=System::Environment::CurrentDirectory; const char*env2=context->marshal_as(env); AfxMessageBox(env2); 删除上下文; 例2)

CString s(系统::环境::当前目录); AfxMessageBox(多个); 例3)

CString s=System::Environment::CurrentDirectory; AfxMessageBox(多个);
您可以从system::String转到CString,因为它们共享一个公共转换(lptstr?)从CString转到system::String将始终需要system::String ^test=gcnew system::String(CStringVar)

您可以从system::String转到CString,因为它们共享一个公共转换(lptstr?)从CString转到system::String总是需要system::String^test=gcnew system::String(CStringVar)

选项3的工作原理与选项2的工作原理基本相同。CString::operator=具有System::String的重载。不要忘记赋值操作符可以做的不仅仅是复制引用

本页: 对于混合应用程序非常有用。太好了


谨防到处散布托管代码。我还处理一个大型MFC应用程序,它是GOT/clr,有时我希望我们只在部分库中完成它。当调用堆栈上有大量托管本机转换时,调试可能会很痛苦。也有。选项3的工作原理与选项2的工作原理基本相同。CString::operator=具有System::String的重载。不要忘记赋值操作符可以做的不仅仅是复制引用

本页: 对于混合应用程序非常有用。太好了

谨防到处散布托管代码。我还处理一个大型MFC应用程序,它是GOT/clr,有时我希望我们只在部分库中完成它。当调用堆栈上有大量托管本机转换时,调试可能会很痛苦。也有

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