代码之家  ›  专栏  ›  技术社区  ›  nerraga

使用clr编译器选项-CString/System::String转换构建的MFC

  •  1
  • nerraga  · 技术社区  · 17 年前

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

    我想知道System::String和CString之间的转换是否是自动的。我发现的MSDN文档表明,这种转换不是自动的,但我没有发现情况确实如此。以下三个示例都有效,MSDN记录了1和2。我很好奇的是例子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 回复  |  直到 17 年前
        1
  •  3
  •   Aidan Ryan    17 年前

    选项3的工作原理与选项2几乎相同。CString::operator=对System::String有重载。别忘了赋值运算符可以做的不仅仅是复制引用。

    此页面: How to: Convert Between Various String Types 非常 适用于混合应用程序。 pin_ptr 太棒了。

    小心不要到处撒托管代码。我还开发了一个大型的MFC应用程序,它是clr,我有时希望我们只在选定的库中完成它。当调用堆栈上有很多托管的本机转换时,调试可能会很痛苦。有 performance considerations 也。

        2
  •  1
  •   Aaron Fischer    17 年前

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