此系列系小九的学堂原创翻译,翻译自微软官方开发向导,一共分为六个主题。本文是第五个主题:.Net Native与反射

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

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


  原文:Reflection and .NET Native

 .NET Native与反射

.NET Framework 4.5

    

 小贴士

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

  

  .NET Framework框架可以通过反射机制来进行元编程(在编译时完成部分本应在运行时完成的工作,可提高工作效率)。反射可以动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。支持序列化和反序列化,它支持一个对象的字段先被持久化之后再进行恢复。.NET Framework运行时just-in-time编译器可以基于可用的元数据来生成本地机器码。   

  .NET native运行时并不包含JIT编译器,所以其编译的机器码必须是提前生成的。当然有一系列的方法来测试哪些代码是已经生成的,但是这些规则并不能涵盖所有的元编程场景。所以需要在运行时提供指令来进行搜索元编程。同时.NET Native并不能将.NET Framework下的私有成员编译。

  下面将介绍如何使用基于反射的API和运行时指令xml文件的配置:

  

  基于反射的API


  

  在一些情况下你并不能得知代码中使用了反射而且.NET Native工具并不会保留运行时需要的元数据。本主题所涵盖的API并不能视为反射的API,但他们是基于反射来执行的。如果你使用这些API的话,需要添加一些信息来运行指令.rd.xml文件,这样就能正常调用这些API,而且不会导致MissingMetadataException的异常。

  例如:Type.MakeGenericType method

  通过调用这个方法可以在运行时动态生成泛型AppClass<T>

  

var t = Type.GetType("App1.AppClass`1", true);
Type[] typeArgs = {typeof(int)};
Type t2 = t.MakeGenericType(typeArgs);
Activator.CreateInstance(t2);

  为使该代码能够成功运行,需要一些元数据支持。首先是在.rd.xml中添加对AppClass<T>的泛型支持

  

<Type Name="App1.AppClass`1" Browse="Required PublicAndInternal" />

  添加后在.NET Framework下就可以调用Type.GetType()方法来获得对象类型了。

  但在.NET Native下调用就会抛出MissingMetadataException的异常。

  

This operation cannot be carried out as metadata for the following type was removed for performance reasons:

App1.AppClass`1<System.Int32>.

  你可以在运行时指令文件(.rd.xml)添加下面运行指令来激活对Int32的支持:

  

<TypeInstantiation Name="App1.AppClass" Arguments="System.Int32"
Activate="Required Public" />

   不同的实例需要不同的指令,添加后就能正常运行。

  类似的方法还有:MethodInfo.MakeGenericMethod method, Array.CreateInstance and Type.MakeTypeArray methods

   所以,在依赖反射的方法使用时,需要添加对反射类型的支持的指令才可以使用。

   运行时指令文件(.rd.xml)配置 


  

  运行时指令文件(.rd.xml)是一个xml配置的文件,指定了配置的程序元素是否可用于反射。下面是该文件的一个样例。

  

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<Namespace Name="Contoso.Cloud.AppServices" Serialize="Required Public" />
<Namespace Name="ContosoClient.ViewModels" Serialize="Required Public" />
<Namespace Name="ContosoClient.DataModel" Serialize="Required Public" />
<Namespace Name="Contoso.Reader.UtilityLib" Serialize="Required Public" /> <Namespace Name="System.Collections.ObjectModel" >
<TypeInstantiation Name="ObservableCollection"
Arguments="ContosoClient.DataModel.ProductItem" Serialize="Public" />
<TypeInstantiation Name="ReadOnlyObservableCollection"
Arguments="ContosoClient.DataModel.ProductGroup" Serialize="Public" />
</Namespace>
</Application>
</Directives>

  文件结构:

  该文件在 http://schemas.microsoft.com/netfx/2013/01/metadata 命名空间下。

  根元素Directives是指令元素,可以包含一个或者多个Library元素和零个或者一个Application元素,结构如下

  

Directives [1:1]
Application [0:1]
Assembly [0:M]
Namespace [0:M]
. . .
Type [0:M]
. . .
TypeInstantiation (constructed generic type) [0:M]
. . .
Namespace [0:M]
Namespace [0:M]
. . .
Type [0:M]
. . .
TypeInstantiation (constructed generic type) [0:M]
. . .
Type [0:M]
Type [0:M]
. . .
TypeInstantiation (constructed generic type) [0:M]
. . .
GenericParameter [0:M]
Method [0:M]
Parameter [0:M]
¶ TypeParameter [0:M]
GenericParameter [0:M]
MethodInstantiation (constructed generic method) [0:M]
Property [0:M]
Field [0:M]
Event [0:M]
TypeInstantiation (constructed generic type) [0:M]
Type [0:M]
. . .
TypeInstantiation (constructed generic type) [0:M]
. . .
Method [0:M]
¶ Parameter [0:M]
¶ TypeParameter [0:M]
GenericParameter [0:M]
MethodInstantiation (constructed generic method) [0:M]
Property [0:M]
Field [0:M]
Event [0:M]
Library [0:M]
Assembly [0:M]
Namespace [0:M]
. . .
Type [0:M]
. . .
TypeInstantiation (constructed generic type) [0:M]
. . .
Namespace [0:M]
Namespace [0:M]
. . .
Type [0:M]
. . .
TypeInstantiation (constructed generic type) [0:M]
. . .
Type [0:M]
Type [0:M]
. . .
TypeInstantiation (constructed generic type) [0:M]
. . .
GenericParameter [0:M]
Method [0:M]
MethodInstantiation (constructed generic method) [0:M]
Property [0:M]
Field [0:M]
Event [0:M]
TypeInstantiation (constructed generic type) [0:M]
Type [0:M]
. . .
TypeInstantiation (constructed generic type) [0:M]
. . .
Method [0:M]
MethodInstantiation (constructed generic method) [0:M]
Property [0:M]
Field [0:M]
Event [0:M]

  

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<!-- Child elements go here -->
</Application>
<Library Name="Extensions">
<!-- Child elements go here -->
</Library>
</Directives>

  在节点中可以配置需要反射拿到的属性。具体开发中遇到的反射问题可以参阅之前的一篇文章:C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解

  由于.NET Native是源生的机器码,它的目的就在于高效率高性能实现.NET Framework架构开发的应用程序的运行,反射消耗性能较多,尽量少用或者更改其他方法来实现逻辑。

  

  更多.rd.xml信息可以参阅:http://msdn.microsoft.com/en-us/library/dn600639(v=vs.110).aspx

  希望大家喜欢这项技术,也可以写下自己对该技术的展望。

C++的性能C#的产能?! - .Net Native 系列五:.Net Native与反射的更多相关文章

  1. React Native 系列(五) -- 组件间传值

    前言 本系列是基于React Native版本号0.44.3写的.任何一款 App 都有界面之间数据传递的这个步骤的,那么在RN中,组件间是怎么传值的呢?这篇文章将介绍到顺传.逆传已经通过通知传值. ...

  2. React Native 系列(五)

    前言 本系列是基于React Native版本号0.44.3写的.任何一款 App 都有界面之间数据传递的这个步骤的,那么在RN中,组件间是怎么传值的呢?这篇文章将介绍到顺传.逆传已经通过通知传值. ...

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

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

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

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

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

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

  6. C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解

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

  7. C++的性能C#的产能?! - .Net Native 系列《一》:.NET Native安装和配置

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

  8. 不可或缺 Windows Native 系列文章索引

    [源码下载] 不可或缺 Windows Native 系列文章索引 作者:webabcd 1.不可或缺 Windows Native (1) - C 语言: hello c 介绍不可或缺 Window ...

  9. 【REACT NATIVE 系列教程之十二】REACT NATIVE(JS/ES)与IOS(OBJECT-C)交互通信

    http://blog.csdn.net/xiaominghimi/article/details/51586492 一用到跨平台的引擎必然要有引擎与各平台原生进行交互通信的需要.那么Himi先讲解R ...

随机推荐

  1. SQLSERVER走起微信公众帐号全新改版 全新首页

    SQLSERVER走起微信公众帐号全新改版 全新首页 今天,SQLSERVER走起微信公众帐号增加了首页功能 虽然还是订阅号,不过已经对版面做了比较大的修改,希望各位亲用得放心.用得安心O(∩_∩)O ...

  2. HTML5 语义元素(二)文本内容

    上一篇介绍的是关于页面结构方面的语义元素,本篇介绍文本内容方面,包含:<bdi>.<details>.<summary>.<mark>.<outp ...

  3. 参考bootstrap中的popover.js的css画消息弹框

    前段时间小颖的大学同学给小颖发了一张截图,图片类似下面这张图: 小颖当时大概的给她说了下,其实小颖也不知道上面那个三角形怎么画嘻嘻,给她说了DOM结构,具体的css让她自己百度,今天小颖自己参考boo ...

  4. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 3.安装Clus ...

  5. java中易错点(二)

    java,exe是java虚拟机 javadoc.exe用来制作java文档 jdb.exe是java的调试器 javaprof,exe是剖析工具 解析一: sleep是线程类(Thread)的方法, ...

  6. Android—基于GifView显示gif动态图片

    android中显示gif动态图片用到了开源框架GifView 1.拷GifView.jar到自己的项目中. 2.将自己的gif图片拷贝到drawable文件夹 3.在xml文件中设置基本属性: &l ...

  7. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  8. mono for android 读取网络远程图片

    布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=& ...

  9. ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus

    ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus 本文承接我的上一篇博文: ASP.NET 5 Linux部署,那篇文章主要是针对最新的ASP. ...

  10. OAuth2 理解

    OAth2 是为了某个应用向第三方应用开放服务时,控制权限的. 因为不可以直接将账户体系开放出去,要求重新登录. 其实本质是让用户在客户端来判断是否要给该应用开放平台的权限,如果用户同意,那么可以拿到 ...