以前一文《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论坛来进行发问。
若想查看该系列前几篇能够点击: 向导