理解.NET中的CLR原理(三)

原创 2003年01月28日 13:47:00

理解.NET中的CLR原理

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

作者:yarshray saga join(如要转载请附上作者,谢谢!)

 

*让我们的语言可以交流        ——— CLS (公共语言系统)

1 统一标准的制定:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

 

了帮助创建兼容 .NET Framework 的语言,Microsoft 设计了公共语言规范 (CLS)。每种语言要使用 .NET Framework 和公共语言运行库,以及与用其他语言编写的组件进行互操作,就必须提供 CLS 所描述的功能。如果一种语言实现了必需的功能,那么它就被称为兼容 .NET。每种兼容 .NET 的语言都支持相同的数据类型,使用相同的 .NET Framework 类,编译为相同的 MSIL,并且使用相同的公共语言运行库管理执行过程。因此,各种兼容 .NET 的语言之间没有优劣之别。开发人员可以自由地为特定的组件选择最好的语言同时又不损失该平台的能力和自由度。另外,使用一种语言编写的组件也能够很容易地与用另外一种语言编写的组件进行互操作。例如,您可以用 C# 编写一个从用 Visual Basic 编写的基类继承而来的类。CLS 已经被提交给 ECMA 进行标准化,这鼓励许多语言开发人员为许多语言创建兼容 .NET 的版本。在撰写本文时有 20 多种兼容 .NET 的语言正在开发中。

 

MSDN是我觉得比较全面的一个介绍:

ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconwhatiscommonlanguagespecification.htm

*在动态中交互                ——— Reflection (反射)

 

CLS加载器管理应用程序域。这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。

Assembly包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。反射通常具有以下用途:

  • 使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。

  • 使用 Module 了解如下的类似信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

  • 使用 ConstructorInfo 了解如下的类似信息:构造函数的名称、参数、访问修饰符(如 publicprivate)和实现详细信息(如 abstractvirtual)等。使用 Type 对象的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。

  • 使用 MethodInfo 来了解如下的类似信息:方法的名称、返回类型、参数、访问修饰符(如 publicprivate)和实现详细信息(如 abstractvirtual)等。使用 Type 对象的 GetMethods 或 GetMethod 方法来调用特定的方法。

  • 使用 FieldInfo 来了解如下的类似信息:字段的名称、访问修饰符(如 publicprivate)和实现详细信息(如 static)等;并获取或设置字段值。

  • 使用 EventInfo 来了解如下的类似信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。

  • 使用 PropertyInfo 来了解如下的类似信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。

  • 使用 ParameterInfo 来了解如下的类似信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。

System.Reflection.Emit 命名空间的类提供了一种特殊形式的反射,使您能够在运行时构造类型。

反射也可用于创建称作类型浏览器的应用程序,它使用户能够选择类型,然后查看有关选定类型的信息。

反射还有其他一些用途。JScript 等语言编译器使用反射来构造符号表。System.Runtime.Serialization 命名空间中的类使用反射来访问数据并确定要持久保存的字段。System.Runtime.Remoting 命名空间中的类通过序列化来间接地使用反射。

 

1 Reflection API开始

参考System.Reflection 命名空间

ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemReflection.htm

2 动态创建Assembly

下面我做一个事例代码首先我下一个代码然后在用动态查看信息:

using System;

public class SayName {

     private const String SayName = "I’m Yarshray";

    

   public SayMyName() {

   }

  

   public void OutPutName() {

       

      Console.WriteLine(SayName);

   }

}

 

 

using System;

using System.Reflection;

public class YarshrayReflection {

   public static void <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Main() {

        

      Assembly as  = Assembly.Load("SayMyName");

      

      Type t = as .GetType("SayMyName");

       

      MethodInfo mi = t.GetMethod("OutPutName");

      

      Object o  = Activator.CreateInstance(t);

      

      mi.Invoke(o);

   }

}

 

 

*属于我们自己的空间          ———  NameSpace  (名称空间)

1 也谈名称空间:

关于名称空间我想不用我多说。它相当一个可以包含类的文件夹。但要注意一点,尽量把相关的类放到同一个名称空间中。因为那样比较方便维护。

如:

namespace YarshrayTools

{

   using System;

 

使用namespace可以方便的定义名称空间,上面我定义了一个名为YarshrayTools的名称空间,using可以很方面的引入名称空间

 

public class YarshrayClass

{

这样就把类放入了名称空间中。引用名称空间中的类的方法如下:

YarshrayTools.YarshrayClass ys=new YarshrayTools.YarshrayClass();

 

你也许,注意到了,我使用的是带名称空间的引用。这种方式叫做 Full Qunalfied Name(完全限定名),当然,如果你在代码中using YarshrayTools

那么就不需要这样做了。

 

附录:

NET框架工具介绍

工具

说明

程序集缓存查看器 (Shfusion.dll)

允许使用 Windows 资源管理器查看和操作全局程序集缓存的内容。

程序集链接器 (Al.exe)

从一个或多个文件(资源文件或 Microsoft 中间语言 (MSIL) 文件)生成一个带有程序集清单的文件。

程序集注册工具 (Regasm.exe)

读取程序集内的元数据并向注册表添加必要的项,以便使 COM 客户端能够透明地创建 .NET 框架类。

程序集绑定日志查看器 (Fuslogvw.exe)

显示失败的程序集绑定的详细信息。这些信息有助于您诊断 .NET 框架无法在运行时找到程序集的原因。

全局程序集缓存工具 (Gacutil.exe)

允许查看和操作全局程序集缓存和下载缓存的内容。由于 Shfusion.dll 提供了类似的功能,所以可以从构造脚本、生成文件文件和批处理文件使用 Gacutil.exe。

安装程序工具 (Installutil.exe)

允许通过执行指定程序集的安装程序组件,安装和卸载服务器资源。

独立存储工具 (Storeadm.exe)

为当前登录的用户列出或删除所有的现有存储区。

本机映像生成器 (Ngen.exe)

从托管程序集创建本机映像,并将其安装在本地计算机的本机映像缓存中。

.NET 框架配置工具 (Mscorcfg.msc)

提供图形界面以管理 .NET 框架安全策略和使用远程处理服务的应用程序。此工具还允许管理和配置全局程序集缓存中的程序集。

.NET 服务安装工具 (Regsvcs.exe)

通过加载、注册程序集并将类型库生成、注册和安装到现有的 COM+ 1.0 应用程序中,将托管类添加到 Windows 2000 组件服务中。

Soapsuds 工具 (Soapsuds.exe)

使用一种称为“远程处理”的技术帮助您编译与 XML Web services 进行通信的客户端应用程序。

类型库导出程序 (Tlbexp.exe)

从公共语言运行库程序集生成类型库。

类型库导入程序 (Tlbimp.exe)

COM 类型库中发现的类型定义转换成托管元数据格式的等同定义。

Web 服务描述语言工具 (Wsdl.exe)

Web 服务描述语言 (WSDL) 协定文件、XML 架构定义 (XSD) 架构文件和 .discomap 发现文档为 XML Web services 和 XML Web services 客户端生成代码。

Web 服务发现工具 (Disco.exe)

发现位于 Web 服务器上的 XML Web services 的 URL,并将与每个 XML Web services 相关的文档保存到本地磁盘上。

XML 架构定义工具 (Xsd.exe)

生成的 XML 架构应遵从 WWW 联合会 (W3C) 提出的 XSD 语言。此工具可生成公共语言运行库类和 XSD 架构文件的 DataSet 类。

调试工具

工具

说明

Microsoft CLR 调试器 (DbgCLR.exe)

使用图形界面提供调试服务,以帮助应用程序开发人员查找和修复针对运行库的各类程序中的错误。

运行时调试器 (Cordbg.exe)

使用公共语言运行库“调试 API”提供命令行调试服务。用于查找和修复针对运行库的各类程序中的错误。

 

推荐文章参考

http://www.zdnet.com.cn/developer/tech/story/0,2000081602,39056220-1,00.htm

 

 

终于完成了,希望对大家会有点帮助。好了,再见各位,下次见。(完)

 

 

 

共享程序集

3.1 两种程序集、两种部署方式      1、.NET 框架支持两种程序集:强命名程序集(strongly named assembly)和非强命名程序集。      强命名程序集有一个发布者的公钥...
  • jilm168
  • jilm168
  • 2007年09月20日 09:56
  • 2468

.NET框架基本原理

1.1  将源代码编译为托管模块    在.NET框架里,正如前言里说的“编译器编译面向.NET框架的源代码产生CIL,只有到了运行时,CLR才将CIL翻译为CPU指令”。1、程序员先用任何支持CLR...
  • doong
  • doong
  • 2006年02月16日 16:40
  • 1632

Net平台下CLR程序载入原理分析

发信人: flier (小海->找啊找工作 :)), 信区: DotNET标 题: .Net平台下CLR程序载入原理分析(草稿)发信站: BBS 水木清华站 (Wed Mar 13 02:08:04 ...
  • lurker0ster
  • lurker0ster
  • 2007年05月06日 17:28
  • 826

理解.NET中的CLR原理

  • lurker0ster
  • lurker0ster
  • 2007年05月06日 17:34
  • 463

理解.NET中的CLR原理(一)

理解.NET中的CLR原理 作者:yarshray saga join(如要转载请附上作者,谢谢!) 首先本文是的目的是要让大家明白,CLR在。NET中的作用是十分重要的,如果要完全掌握。NET那么理...
  • yarshray
  • yarshray
  • 2003年01月28日 13:43
  • 2348

理解.NET中的CLR原理(二)

理解.NET中的CLR原理 作者:yarshray saga join(如要转载请附上作者,谢谢!) *我们手中的零件              ——— Assembly (装配件)1. 关于装配件*...
  • yarshray
  • yarshray
  • 2003年01月28日 13:47
  • 1577

CLR学习笔记--深入理解多态机制

一、引言 所谓万事开头难,哪怕是写一个学习笔记,以前看惯别人写的博客文章,当时看了就看了,只有一种感觉就是解决了心中的好久疑团,现在自己去写才了解,也许你看了只有短短几分钟,可别人却下了功夫,用了很多...
  • u011964267
  • u011964267
  • 2013年09月05日 17:14
  • 1308

.NET Framework版本与CLR版本之间的关系

个人觉得很有用的一篇文章,不知道那位大虾写的,描述的很清晰,转给大家分享。   .Net Framework 1.1 是VS2003的,与2.0不太兼容,1.1开发的程序,在移植到2.0环境时,需...
  • sdtsfhh
  • sdtsfhh
  • 2011年08月28日 15:38
  • 4499

详解.net 中C# 编程中 堆(托管堆CLR) 和 栈

转载于 http://www.c-sharpcorner.com/article/C-Sharp-heaping-vs-stacking-in-net-part-ii/ Even t...
  • elfprincexu
  • elfprincexu
  • 2016年05月10日 15:16
  • 641

C# - .net framework和CLR各版本之间的关系

.Net版本之间是有一定联系的,目前为止微软推出了3个版本的CLR,分别是 1.1, 2.0 , 4.0 并且你要注意的是 .Net 4是基于CLR4的,而.Net 2.0 3.0 3.5都是基于...
  • Gykimo
  • Gykimo
  • 2014年05月25日 18:18
  • 6112
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:理解.NET中的CLR原理(三)
举报原因:
原因补充:

(最多只允许输入30个字)