2008-11-20 100 views
1

我有一個相當大的MFC應用程序剛從VS6.0遷移到VS2008。這是一個非常痛苦的過程,但現在我想探索任何可用的託管代碼選項。我能夠使用/ clr開關成功構建項目,似乎可以讓我訪問託管類型。MFC使用/ clr編譯器選項構建 - CString/System :: String轉換

我想知道System :: String和CString之間的轉換是否自動進行。我發現的MSDN文檔表明這種轉換不是自動的,但我沒有發現這種情況。以下所有三個示例都可以工作,MSDN也記錄了1和2。我很好奇的是示例3,它也有效,但我不知道爲什麼。 CurrentDirectory屬性正在將一個指針返回到託管堆字符串^,但是爲什麼我能夠將它分配給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); 

回答

3

選項3的作用與選項2的作用基本相同。 CString :: operator =對System :: String有一個重載。不要忘記,賦值運算符可以做比複製引用更多的功能。

本頁面: How to: Convert Between Various String Types混合的應用程序非常有用pin_ptr很棒。

請小心謹慎地噴灑託管代碼。我也在一個大型的MFC應用程序上運行/ clr,我有時希望我們只在選擇庫中完成它。當callstack上有很多託管本機轉換時,它會使調試變得很痛苦。還有performance considerations

1

您可以從系統中去:: String要CString的,因爲他們都有一個共同的從CString轉換爲System :: String的轉換(lptstr?)將始終需要System :: String^test = gcnew System :: String(CStringVar);