我需要將非常大的C++項目轉換爲clr safe。當前的C++項目有很多來自C++的東西,比如模板,泛型,指針,存儲/流,ole apis,zlib壓縮API,內聯等等。我在哪裏可以找到這種類型轉換的datiled文檔?你能推薦一些好書參考嗎?如果你們中的任何人做過這樣的轉換,我可以從你那裏得到一些分析嗎?將C++項目轉換爲clr安全項目
2
A
回答
1
絕大多數本地C++是完全有效的C++/CLI,包括模板,內聯等,除了CLR STL與BCL相比相當慢之外。另外,本地C++沒有泛型,只有模板。
編譯爲C++/CLI的現實是檢查開關並推送編譯,並等待它發生錯誤。
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
相關問題
- 1. 將Maven項目轉換爲Netbeans項目
- 2. m2e:將項目轉換爲maven項目
- 3. Android將項目轉換爲庫項目
- 4. 將iPhone項目轉換爲iPad項目?
- 5. 將C#項目轉換爲Dll for C++項目
- 6. 將C++項目從.exe轉換爲.dll?
- 7. 將C#庫轉換爲MSTest項目
- 8. 將C++ .exe項目轉換爲DLL
- 9. 將vb.Net項目轉換爲C#.Net項目
- 10. 如何將C# - Xaml - Visual Studio項目轉換爲Xamarin項目
- 11. 將C++(DLL)項目轉換爲COM DLL項目
- 12. C#:如何將網站項目轉換爲Web項目
- 13. 如何將VB5項目轉換爲c#項目
- 14. Xcode:將「命令行工具」項目轉換爲「C/C++庫」項目
- 15. C#VB.net項目轉換
- 16. 轉換C++項目2010
- 17. MOD安全項目
- 18. 項目轉換
- 19. 如何將Ant項目轉換爲Maven項目
- 20. 將使用插件的maven項目轉換爲gradle項目
- 21. 將Android項目轉換爲Eclipse中的「常規」Java項目?
- 22. 將Netbeans項目轉換爲啓用Maven的項目
- 23. 如何將eclipse java項目轉換爲groovy項目?
- 24. 將項目列表轉換爲項目元組列表
- 25. 將項目轉換爲Eclipse中的maven項目
- 26. 如何將Java項目轉換爲Ant中的插件項目?
- 27. 將flex web項目轉換爲flex項目
- 28. 鈦 - 將一個新項目轉換爲移動項目
- 29. 將Eclipse項目轉換爲Eclipse上的Android項目
- 30. 將JPA項目轉換爲java項目eclipse
絕大多數C++是C++/CLI,但不是「安全的」C++/CLI。任何觸及本地類或指針的內容在「安全」模式下都是無效的。 – 2010-08-21 15:44:00