2010-08-21 134 views
2

我需要將非常大的C++項目轉換爲clr safe。當前的C++項目有很多來自C++的東西,比如模板,泛型,指針,存儲/流,ole apis,zlib壓縮API,內聯等等。我在哪裏可以找到這種類型轉換的datiled文檔?你能推薦一些好書參考嗎?如果你們中的任何人做過這樣的轉換,我可以從你那裏得到一些分析嗎?將C++項目轉換爲clr安全項目

回答

1

絕大多數本地C++是完全有效的C++/CLI,包括模板,內聯等,除了CLR STL與BCL相比相當慢之外。另外,本地C++沒有泛型,只有模板。

編譯爲C++/CLI的現實是檢查開關並推送編譯,並等待它發生錯誤。

+0

絕大多數C++是C++/CLI,但不是「安全的」C++/CLI。任何觸及本地類或指針的內容在「安全」模式下都是無效的。 – 2010-08-21 15:44:00

2

我就咳嗽了MSDN庫文章,題爲「如何:遷移到/ CLR:安全

的Visual C++可以生成使用/ CLR覈實的組成部分:安全的,這使編譯器生成的錯誤每個非可驗證代碼構造

以下問題產生覈查錯誤:。

  • 原生類型,即使不使用它,本地類,結構,指針,或陣列將防止編譯的聲明
  • 全局變量
  • 函數調用到任何非託管庫,包括公共語言運行時函數調用
  • 可驗證的功能不能包含下鑄造的static_cast操作。 static_cast操作符可以用於在基本類型之間進行投射,但是對於向下投射,必須使用safe_cast或C-Style投射(作爲safe_cast實施)。
  • 可驗證函數不能包含reinterpret_cast運算符(或任何C風格的類型轉換)。
  • 可驗證函數不能對interior_ptr執行算術運算。它只能分配給它並對其進行解引用。
  • 可驗證的函數只能引用或捕獲指向引用類型的指針,因此值類型必須在引發之前進行裝箱。
  • 可驗證的函數只能調用可驗證的函數(例如,不允許調用公共語言運行庫,包括AtEntry/AtExit,因此不允許使用全局構造函數)。
  • 可驗證的類不能使用顯式。
  • 如果構建EXE,主函數不能聲明任何參數,所以必須使用GetCommandLineArgs來檢索命令行參數。
  • 對虛擬功能進行非虛擬調用。

此外,下面的關鍵字不能在覈查的代碼中使用:

  • 託管型包編譯指示
  • 赤裸裸地對準__declspec修飾符
  • __asm
  • __based
  • __try和__except

我想這會讓你忙一陣子。沒有魔術棒可以將本機C++轉換爲可驗證的代碼。你確定這是值得的投資?

1

重寫本地C++到安全 C++/CLI將導致代碼在語法上與C#在語義上不同,但其語法相同。如果是這樣的話,爲什麼不直接用C#重寫呢?

如果你想避免什麼本質上是一個完全重寫,考慮以下方案:

  • 的P/Invoke。不幸的是,我不熟悉這是否會隔離不安全的代碼。即使它可以執行隔離,您也需要將現有的C++代碼封裝到程序化的C類API中,以便P/Invoke可以使用它。另一方面,除非你的API過於瑣碎,否則你會保持(大部分)你的本地性能。
  • 將您的C++封裝到進程外COM服務器中,並使用COM Interop從管理的代碼中使用它。這樣,您的託管代碼就完全免受C++端可能發生的任何損壞,並且可以保持「安全」。不利之處在於,您將獲得進程外封送處理的性能優勢,以及爲正確實施COM而需要花費的實施成本。
+0

模板,使用本機頭文件的p/invoke,堆棧語義以更好地管理一次性對象,C++/CLI實際上具有很多C#不具備的功能。這是否可以彌補更笨重的屬性和事件語法是有爭議的。 – 2010-12-07 03:10:00