IT知识库 购物 网址 游戏 小说 歌词 快照 开发 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 编程 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> C# -> C++的性能C#的产能?! -> 正文阅读

[C#]C++的性能C#的产能?!

C++的性能C#的产能?!    此系列系小九的学堂原创翻译,翻译自微软官方开发向导,一共分为六个主题。本文是第五个主题:.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
  希望大家喜欢这项技术,也可以写下自己对该技术的展望。
上一篇文章      下一篇文章      查看所有文章
加:2015-03-29 22:43:36  更:2017-05-14 17:28:43 
 
  C# 最新文章
字符串阵列分别输出元素的索引,原值和长度
格式化你的字符串
C#宣告一个变量
C#中级
拆分一个字符串并把每个字符单独输出
通过手机号定位归属地
C# DBNULL与NULL之间的区别【转】
Xamarin
List,DataTable实现行转列的通用方案
C# 语音识别
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 新闻资讯 小游戏 Chinese Culture 股票 三丰软件 开发 中国文化 网文精选 阅读网 看图 日历 万年历 2019年2日历
2019-2-16 12:32:58
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库