1

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

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

示例 1)

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

例 2)

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

例 3)

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

2 回答 2

3

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

此页面: 如何:在各种字符串类型之间进行转换 对于混合应用程序非常有用。pin_ptr很棒。

小心散布托管代码。我还在一个大型 MFC 应用程序上工作,该应用程序转到 /clr,我有时希望我们只在选择的库中完成它。当调用堆栈上有很多托管本机转换时,它会使调试变得痛苦。还有性能方面的考虑

于 2008-11-20T02:31:54.757 回答
1

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

于 2008-11-20T01:13:55.817 回答