.NET Native:將.NET應用編譯為原生應用

jopen 9年前發布 | 9K 次閱讀 .NET Native


什么是.NET Native? .NET Native 是一套在Visual Studio 2015中編譯通用Windows(UWP)應用的預編譯工具,它可以將托管的中間語言二進制文件編譯為本地二進制文件,每一個托管的通用Windows 應用都將受益于這項新技術。在用戶設備上安裝之前,應用會自動編譯為原生代碼。有關其工作機制的詳情可以查看 MSDN

.NET Native會帶來什么?根據不同的情況,.NET Native所帶來的好處各種各樣。不過在大多數情況下,.NET Native將會使得應用啟動更快、運行更好、占用用戶系統資源更少。具體優點如下:

  • 冷啟動效率提升60%
  • 熱啟動效率提升40%
  • 原生編譯時應用占用內存資源更少
  • 系統無需安裝桌面.NET Runtime
  • 由于應用在本地編譯,性能可以借助原生代碼的優勢得到改善
  • 可利用業內領先的C#或VB及其編程語言工具
  • 提供全面而一致的.NET編程模型,包括編寫業務模型所需的擴展API、內置內存管理以及異常處理等

Debug和Release兩種編譯模式的差異.NET Native的編譯過程十分復雜,相比于傳統的.NET編譯,編譯時間稍微長一些。上面提到的那些優點犧牲了一部分編譯時間。Visual Studio在編譯應用時會提醒開發者這一點,保證了良好的開發體驗。

當使用Debug編譯模式時,在應用中運行的是中間語言代碼,.NET系統部件不和應用代碼一起封裝,而且應用需要依賴 Microsoft.NET.CoreRuntime (CoreCLR)包。這就意味著,開發者可以享有最優的開發體驗。編譯和配置都十分迅速,有著豐富的調試和診斷信息,在.NET開發中還可以使用所有熟悉的工具。

而對于Release模式,應用會默認使用.NET Native工具鏈。由于程序包編譯成了本地二進制文件,它就不用再包含.NET框架庫。另外,程序包依賴于最新安裝的.NET Native Runtime而不是CoreCLR包,設備上的.NET Native Runtime始終與應用程序包兼容。

通過Release的本地原生編譯可以在一個模擬用戶使用的環境里對應用進行測試。在應用開發過程中,定期的測試十分重要,這樣可以保證查找和修改.NET Native編譯器相關的錯誤。大多數情況下.NET Native編譯器會正常工作,但在少數情況下可能就不那么順利了,比如4維以上的數組可能引發錯誤。用戶最后獲得的是.NET Native編譯的應用,所以最好在開發過程中測試應用的版本,確認無誤而后再發布。

另外需要補充的是,.NET Native取消了跨平臺的編譯模式。原生編譯的架構獨立,因此跨平臺編譯不再有用。一個附加的結果是,當開發者打包應用程序時,需要將三個體系結構配置(x86、x64、ARM)全部選中,以保證應用程序對所有的設備都能兼容。

.NET Native改變了打發布包的方式,這是給工作流帶來的最后一個重大變化。.NET Native的一大特點是,編譯器可以放置在云端。在Visual Studio中編譯應用包時會創建兩個包,一個是.appxupload文件,另一個是側面加載用的“測試”.appx文件。.appxupload包含了MSIL二進制文件和應用使用的.NET Native工具鏈版本信息(也記錄在了AppxManifest.xml文件中)。編譯后的程序包接下來放入應用商店,然后被相同版本的.NET Native工具鏈編譯。因為編譯器置于云端,開發者無需在本地重新編譯應用程序,便能夠反復多次修改程序缺陷。

這樣的改變給開發者工作流又帶來了另外兩個改變。第一是開發者不能修改應用程序包的第四個版本號,這是因為應用商店需要通過修改版本號來標記在云端的每一次編譯行為。不過開發者還能修改其他三個 版本號 ,所以不必有太大的疑慮。第二是需要開發者特別注意上傳到應用商店的程序包。應用商店代替開發者進行原生編譯,所以開發者不能上傳本地.NET Native編譯器生成的原生二進制文件。對此,Visual Studio會幫助開發者選擇正確的文件。

總結來說,.NET Native帶來的最主要的變化是以下幾點:

  • 使用Release模式定期測試開發的應用程序
  • 確保修訂包編號為0(Visual Studio不允許修改,也不要使用文本編輯器修改)
  • 只上傳創建包時生成的.appxupload文件至應用商店。如果上傳通用Windows平臺的.appx文件,應用商店會拒絕并報錯

使用.NET Native的其他小技巧如果開發者懷疑.NET Native造成了某些錯誤,可以嘗試用以下方法解決。因為Release模式默認優化了代碼,這會丟失Debug模式下需要的一些生成文件,所以在 Release模式中調試可能會出現錯誤。開發者可以新建一個自定義模式來使用.NET Native工具鏈,同時不要優化代碼。詳細內容可以查看 這里

從一開始就避免.NET Native相關的錯誤無疑是更好的選擇。 Microsoft.NET Native.Analyzer 在開發過程中如果遇到代碼與.NET Native沖突,會給出相應的警告。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!