之前一文《c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥》 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方信息的翻译开始做起。

  此系列系小九的学堂原创翻译,翻译自微软官方开发向导,一共分为六个主题。第一个主题是:《.NET Native安装和配置》 本文是第二个主题:.NET Native开发流程详解。

  向导文链接:《C++的性能C#的产能?! - .Net Native 系列:开发向导》

  [小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源:小九的学堂。cnblogs.com/xfuture]


    原文:.NET Native Getting Started

 .NET Native开发流程详解

.NET Framework 4.5

    

 小贴士

这个主题依赖于预发行的.net native开发者预览版。下载地址: Microsoft Connect website. 友情提示需要注册..

  在无论是对新开发的windows store app进行.net native编译 还是 对现有的app进行移植.net native,遵循的流程是相同的。

  创建.net native app步骤如下:

    1.  在已有的开发环境(windows, desktop, clr)下开发一个应用程序,配置好.net native相关文件,并进行测试确保其可运行。

    2.    使用.net native编译app

    3.  解决反射和序列化带来的额外消耗

    4.  部署和测试

    5.  发现并解决问题,直到部署和测试通过。

  【本文着重前三个开发流程,部署和测试将在下篇文章 .net native部署和测试 中进行详细分析】

  

 小贴士

如果你进行的是对现有app移植到.net native编译,一定要对更改后的app进行完全的测试。

  

  下面是对步骤1,2,3的详解:

  Step1: 在已有的开发环境(windows, desktop, clr)下开发一个应用程序,配置其.net native相关文件


  无论是对新开发的windows store app进行.net native编译 还是 对现有的app进行移植.net native,遵循的步骤是相同的。但当你新建一个项目时,你需要手动来启用.net native配置组件:

  

    1.  新建一个C# windows store app项目 或者打开一个已存在的windows store app project.

    2.  在解决方案资源管理器中,右键项目,选择Enable for .NET Native。然后会自动添加一个名为default.rd.xml到项目中。保留这个文件,因为它指定了一个默认的元数据的协议(metadata policy)作为应用开发的一个入口。

    3.  需要注意的是,有些Windows应用商店的应用程序项目和.net native有一些兼容性问题。关于移植相关之后会有文章涉及。暂时先给出英文链接 Migrating Your Windows Store App to .NET Native

  

  现在您就可以使用C#来编写在x64或者模拟器上可以运行的.net native的程序了。只有经过Step2设置后才能做到不依赖.net framework,机器码。开发阶段依然使用的clr,并没有调用.net native 静态链接库。

  提示: 当您在开发中一定要注意反射和序列化的部分,在.net native中这些机制会有额外消耗。

  Step2: .Net Native编译项目


  项目开发阶段结束后,一直运行机制是.net framework clr。

  遵循下列步骤,将项目转化为.net native编译成的机器码发行版本:

  

  1.  在项目Active config配置中选择相应运行的平台,比如x64或者ARM.

  

  2.  启动.net native编译。选择项目属性-生成栏下将Compile with .NET Native tool chain选项选中打勾。

  

  当做完上述步骤后,您就可以部署app到相应的机器上来进行测试。当你进行调试时,你将自动使用.net native 调试机制。如果你发现程序集加载了mrt100.dll,这就说明您的项目是.net native项目。

  如果想恢复原本配置不使用.net native , 可以查看上篇文章《.NET Native安装和配置》

  

  Step3: 解决反射和序列化带来的额外消耗


  当你选择Enable for .NET Native选项时会生成默认的运行时指令文件:Default.rd.xml. 该文件会提供程序运行时所有需要的元数据, 大部分情况下提供的元数据是足够程序运行的。但是有一些编程方式会导致额外的开销。

  序列化

  有两种序列化方式可能会导致运行时指令文件的额外开销:

    1.  不基于反射的序列化。在.NET Framework中比如 DataContractSerializer, DataContractJsonSerializer, XmlSerializer等类并不依赖于反射。他们需要对象序列化和反序列化时生成的代码段。详细信息可以参阅:Microsoft Serializers 篇章:Serialization and Metadata.

    2.  第三方的序列化。第三方序列化库,最经常使用的是Newtonsoft JSON serializer。它是基于反射和需要*.rd.xml的入口来进行对象的序列和反序列化。详细信息可以参阅:"Third-Party Serializers" 篇章:Serialization and Metadata.

  

  反射

  依赖反射的方法:

    在一些项目中, 代码中使用反射并不明显。有一些常用的API或者在编程中不认为是反射的部分,其实却是依靠反射来成功执行的。比如 类型的实例化和方法的构建:

      1.  The Type.MakeGenericType method

      2.  The Array.CreateInstance and Type.MakeArrayType method 

      3.  The MethodInfo.MakeGenericMethod method

    更多信息可以查看:APIs That Rely on Reflection.

    

 小贴士

运行指令文件中使用的类型名称一定要是全称.比如必须要是“System.String” 而并不能只是“String”.


  

  下一篇是关于.net native 部署和测试篇。敬请期待!

C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解的更多相关文章

  1. React Native探索(四)Flexbox布局详解

    相关文章 React Native探索系列 前言 在Android开发中我们有很多种布局,比如LinearLayout和RelativeLayout,同样在React Native也有它的布局,这个布 ...

  2. React Native 系列(二) -- React入门知识

    前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...

  3. React Native 系列(二)

    前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...

  4. C++的性能C#的产能?! - .Net Native 系列五:.Net Native与反射

    此系列系小九的学堂原创翻译,翻译自微软官方开发向导,一共分为六个主题.本文是第五个主题:.Net Native与反射. 向导文链接:<C++的性能C#的产能?! - .Net Native 系列 ...

  5. C++的性能C#的产能?! - .Net Native 系列《三》:.NET Native部署测试方案及样例

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  6. C++的性能C#的产能?! - .Net Native 系列向导

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  7. 性能百万/s:腾讯轻量级全局流控方案详解

    WeTest 导读 全新的全局流控实现方案,既解决了目前流控的实现难点,同时保证运行稳定且流控准确的前提下,实现更简单,部署成本更低,容灾能力更强. 该方案组件化之后,可以推广到别的有需要的部门使用, ...

  8. 性能百万/s:腾讯轻量级全局流控方案详解【转自Wetest】

    阿里用的方案是在nginx中配置限流(限流功能模块是自己开发的),流量统计线上是有监控打通的,具体的限流值是通过线上流量表现+线下性能测试(模拟线上场景)测试得出的. 全新的全局流控实现方案,既解决了 ...

  9. C++的性能C#的产能?! - .Net Native 系列四:性能测试方法(PerfView)

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

随机推荐

  1. ECMAScript 5

    2009年12月,ECMAScript 5.02011年6月,ECMAscript 5.1版发布2015年6月,ECMAScript 6正式通过,成为国际标准ES6第一个版本 ES2015,发布于20 ...

  2. 【转载】关于treeview的多层显示的科学用法!

    http://blogs.msdn.com/b/mikehillberg/archive/2009/10/30/treeview-and-hierarchicaldatatemplate-step-b ...

  3. mysql salve从库设置read only 属性

    在MySQL数据库中,在进行数据迁移和从库只读状态设置时,都会涉及到只读状态和Master-slave的设置和关系.     经过实际测试,对于MySQL单实例数据库和master库,如果需要设置为只 ...

  4. 整理:深度学习 vs 机器学习 vs 模式识别

    http://www.csdn.net/article/2015-03-24/2824301 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等) http://developer ...

  5. Beginning Scala study note(3) Object Orientation in Scala

    1. The three principles of OOP are encapsulation(封装性), inheritance(继承性) and polymorphism(多态性). examp ...

  6. Bug库

    netsh int tcp set global  ecn=disable C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe ...

  7. 【字符串匹配】KMP算法和next数组的c/c++实现

    KMP算法基本思想有许多博客都写到了,写得也十分形象,不懂得可以参考下面的传送门,我就不解释基本思想了.本文主要给出KMP算法及next数组的计算方法(主要是很多网上的代码本人(相信应该是许多人吧)看 ...

  8. 使用命令行+ideal 工具实现本地代码项目提交

    在 OSChina 上建立一个私用的项目 mkdir test cd test git init touch README.md git add README.md git commit -m &qu ...

  9. HashMap的内部实现机制,Hash是怎样实现的,什么时候ReHash

    1.HashMap的内部实现机制 HashMap是对数据结构中哈希表(Hash Table)的实现,Hash表又叫散列表.Hash表是根据关键码Key来访问其对应的值Value的数据结构,它通过一个映 ...

  10. 【转】bash 参数展开(Parameter Expansion)

    转自:http://www.360doc.com/content/13/0513/20/9437165_285204629.shtml ${parameter} 取parameter的值 ${para ...