以前一文《c++的性能, c#的產能?!魚和熊掌能夠兼得,.NET NATIVE初窺》 得到不少朋友支持和鼓勵,也更讓我堅決作這項技術的推廣者,但願能讓更多的朋友瞭解這項技術,因而先從官方信息的翻譯開始作起。html
此係列系小九的學堂原創翻譯,翻譯自微軟官方開發嚮導,一共分爲六個主題。本文是第三個主題:.NET Native部署測試及樣例。c++
嚮導文連接:《C++的性能C#的產能?! - .Net Native 系列:開發嚮導》web
[小九的學堂,致力於以平凡的語言描述不平凡的技術。如要轉載,請註明來源:小九的學堂。cnblogs.com/xfuture]c#
原文:.NET Native Getting Startedwindows
.NET Native部署測試及樣例性能優化
.NET Framework 4.5app
![]() |
---|
這個主題依賴於預發行的.net native開發者預覽版。下載地址: Microsoft Connect website. 友情提示須要註冊..框架 |
開發流程移步步驟《二 . NET Native開發流程詳解》ide
部署及測試:性能
當你開發流程結束,配置成功.Net Native Tools而且更新了運行時指令文件, 你能夠開始重建和部署測試你的應用。.Net Native 原生的二進制文件放置在項目屬性配置的生成輸出目錄的子目錄ILC.out中。若沒有這個文件夾,則說明該項目並無被.Net Native成功編譯。
.Net Native 目前支持x64和arm框架,因此你只能部署該應用程序到相應的設備中。以後您須要在該設備上進行測試和解決故障。
若是你的應用程序不能正常運行(尤爲是運行時拋出了MissingMetadataException或MissingInteropDataException異常),您須要按照下一塊內容:手動解決缺乏元數據異常。啓動First-chance exception(程序產生了異常並被捕獲,繼續運行) 能夠幫助您發現這些bugs。
通過了測試和調試錯誤,您已經對上述的異常進行很好的處理後,應該測試一些性能優化狀況。要作性能測試,必需要將項目構建從debug改爲release,測其發行版本。
常見的問題:
.net native 最多見的問題就是遇到MissingMetadataException了。該異常會致使程序出現不可預測的行爲甚至崩掉。本節來討論如何經過在運行時添加指令來進行調試和解決此類型的異常。有關運行指令格式相關的信息,請參照:Runtime Directives (rd.xml) Configuration File Reference.當你添加好運行指令後,你能夠部署和測試你的應用程序而且解決元數據的相關異常。
注意: 添加指令並不該該更改底層代碼,應該在較高層次集中處理。建議在命名空間或者類型初添加指令,而不是每一塊代碼段。添加指令後機器碼項目編譯時間也會增加。
當處理元數據丟失的異常時,應考慮以下問題:
1. 應用程序作了什麼致使了這個異常? 例如它是不是數據綁定?仍是序列化和反序列化拿到數據?或者是反射?
2. 這個異常是不是廣泛的?例如當序列化一個對象時產生了該異常,你就須要每個序列化的部分都來檢查測試一下了。
3. 儘可能少的用反射。重構代碼,將反射部分儘量的更換機制。
測試中遇到問題的樣例:
Example: Handling Exceptions When Binding Data
這個例子是一個.Net Native項目當綁定數據時遇到的MissingMetadataException異常。異常信息以下:
This operation cannot be carried out as metadata for the following type was removed for performance reasons: App.ViewModels.MainPageVM
下面是相關棧調用的信息:
Reflection::Execution::ReflectionDomainSetupImplementation.CreateNonInvokabilityException+0x238 Reflection::Core::ReflectionDomain.CreateNonInvokabilityException+0x2e Reflection::Core::Execution::ExecutionEnvironment.+0x316 System::Reflection::Runtime::PropertyInfos::RuntimePropertyInfo.GetValue+0x1cb System::Reflection::PropertyInfo.GetValue+0x22 System::Runtime::InteropServices::WindowsRuntime::CustomPropertyImpl.GetValue+0x42 App!$66_Interop::McgNative.Func_IInspectable_IInspectable+0x158 App!$66_Interop::McgNative::__vtable_Windows_UI_Xaml_Data__ICustomProperty.GetValue__STUB+0x46 Windows_UI_Xaml!DirectUI::PropertyProviderPropertyAccess::GetValue+0x3f Windows_UI_Xaml!DirectUI::PropertyAccessPathStep::GetValue+0x31 Windows_UI_Xaml!DirectUI::PropertyPathListener::ConnectPathStep+0x113
這個應用是WPF程序,Xaml中的空間元素(View)經過綁定和PropertyInfo.GetValue來經過類型拿到上下文數據載體(ViewModel)屬性的值。可是這個屬性的元數據丟失了,因此報出了元數據丟失的異常。
解決方案:
第一步設置該對象是可序列化的,保證其是可訪問的:
<Type Name="App.ViewModels.MainPageVM" Serialize="Required Public" />
第二步考慮其是否爲廣泛問題。在本例中全部viewmodel都存在該問題,因此不該一次只修改一個地方後就繼續進行調試。因爲全部viewmodel都在app.viewmodels裏因此能夠進行以下設置:
<Namespace Name="App.ViewModels " Serialize="Required Public" />
因爲數據綁是基於反射的,因此沒法經過更改代碼方式來避免反射。但有一些方法能夠作到在編譯時就將view和viewmodel關聯起來,不依賴運行時來保存元數據。例如能夠設置Windows.UI.Xaml.Data.BindableAttribute 屬性,它會讓編譯器在編譯時關聯上下文,避免使用運行時Default.rd.xml序列化來拿元數據。
有關rd.xml能夠參閱Runtime Directives (rd.xml) Configuration File Reference.
在開發中可能會遇到更多的問題,能夠MSDN論壇來進行發問。
若想查看該系列前幾篇能夠點擊: 嚮導