*
与本机代码无关
———
MSIL
(中间语言)
*
让我们使用同一种语言
———
CLR
(公共语言运行时)
*
我们手中的零件
———
Assembly
(装配件)
*
让我们在同一个系统中运行
———
CTS
(通用类型系统)
*
宇宙大爆炸后的产物
———
metadata
(元数据)
*
让我们的语言可以交流
———
CLS
(公共语言系统)
*
在动态中交互
———
Reflection
(反射)
*
属于我们自己的空间
———
NameSpace
(名称空间
)
|
MSIL:
微软中间语言
|
Reflection:
反射
|
Metadata:
元数据
|
PE:
可执行可移植文件
|
Assembly:
程序集(装配件)
|
NameSpace:
名称空间
|
CTS:
通用类型系统
|
GC(Garbage Colection) :
无用单元回收
|
CLR:
公共语言系统
|
Attribute:
属性(注意不要和
Property
混淆)
|
Boxing:
装箱
|
UnBoxing:
拆箱
|
正文:下面让我们进入整文
|
平台无关本机代码
|
MSIL
|
使用。NET支持的语言所编写的代码
|
JIT
|
编译
|
.NET PE File Format
|
l
COFF and PE Headers
l
Code and Data Sections
l
Metadata Tables and IL Organization
l
Java Class File Format vs. .NET PE File For
|
- 用户执行编译器输出的应用程序(PE文件),操作系统载入PE文件,以及其他的DLL(.NET动态连接库)。
- 操作系统装载器根据PE文件中的可执行文件头跳转到程序的入口点。显然,操作系统并不能执行中间语言,该入口点也被设计为跳转到mscoree.dll(.NET平台的核心支持DLL)的_ CorExeMain()函数入口。
- CorExeMain()函数开始执行PE文件中的中间语言代码。这里的执行的意思是CRL(通用语言运行时)按照调用的对象方法为单位,用JIT(即时编译器)将中间语言编译成本地机二进制代码,执行并根据需要存于机器缓存。
- 程序的执行过程中,GC(垃圾收集器)负责内存的分配,释放等管理功能。
- 程序执行完毕,操作系统卸载应用程序。
已重载。确定两个 Object 实例是否相等。
| |
用作特定类型的哈希函数,适合在哈希算法和数据结构(如哈希表)中使用。
| |
获取当前实例的 Type。
| |
确定指定的 Object 实例是否是相同的实例。
| |
返回表示当前 Object 的 String。
|
AttributeUsage(AttributeTargets.All)] public class YarshrayAttribute : System.Attribute { private string name; private int age; private bool sex; public DeveloperAttribute(string name,int age,bool sex) { this.Name = name; this.Age = age; this.Sex = sex; } public virtual string Name { get {return name;} } public virtual int Age { get {return age;} } public virtual bool Sex { get {return sex;} set {sex = value;} } } [YarshrayAttribute(“yarshray”,”21”,Sex=true;] public class YarshrayTest { public Yarshray() { //nothing just make a test } } |
Using System.Relection;
Using System;
Namespace yarshrayAPP{
public class yarshrayConsoleApp
{
public static void Main()
{
MemberInfor om;
om=typeof(YarshrayTest);
object o;
o=om.GetCustomAttribute(typeof(Yarshray),true);
YarshrayAttribute ya=( YarshrayAttribute)o;
Console.WriteLine(“name:”+ys.Name);
Console.WriteLine(“Age:”+ys.Age);
Console.WriteLine(“Sex:”+ys.Sex);
}
}
|
作者:yarshray saga join(如要转载请附上作者,谢谢!)
*让我们的语言可以交流 ——— CLS (公共语言系统)
1. 统一标准的制定:
了帮助创建兼容 .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 了解如下的类似信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 对象的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。
- 使用 MethodInfo 来了解如下的类似信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 对象的 GetMethods 或 GetMethod 方法来调用特定的方法。
- 使用 FieldInfo 来了解如下的类似信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 static)等;并获取或设置字段值。
- 使用 EventInfo 来了解如下的类似信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。
- 使用 PropertyInfo 来了解如下的类似信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。
- 使用 ParameterInfo 来了解如下的类似信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。
System.Reflection.Emit 命名空间的类提供了一种特殊形式的反射,使您能够在运行时构造类型。
反射也可用于创建称作类型浏览器的应用程序,它使用户能够选择类型,然后查看有关选定类型的信息。
反射还有其他一些用途。JScript 等语言编译器使用反射来构造符号表。System.Runtime.Serialization 命名空间中的类使用反射来访问数据并确定要持久保存的字段。System.Runtime.Remoting 命名空间中的类通过序列化来间接地使用反射。
:
1. 从Reflection API开始
:
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 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框架工具介绍
工具 | 说明 |
允许使用 Windows 资源管理器查看和操作全局程序集缓存的内容。 | |
从一个或多个文件(资源文件或 Microsoft 中间语言 (MSIL) 文件)生成一个带有程序集清单的文件。 | |
读取程序集内的元数据并向注册表添加必要的项,以便使 COM 客户端能够透明地创建 .NET 框架类。 | |
显示失败的程序集绑定的详细信息。这些信息有助于您诊断 .NET 框架无法在运行时找到程序集的原因。 | |
允许查看和操作全局程序集缓存和下载缓存的内容。由于 Shfusion.dll 提供了类似的功能,所以可以从构造脚本、生成文件文件和批处理文件使用 Gacutil.exe。 | |
允许通过执行指定程序集的安装程序组件,安装和卸载服务器资源。 | |
为当前登录的用户列出或删除所有的现有存储区。 | |
从托管程序集创建本机映像,并将其安装在本地计算机的本机映像缓存中。 | |
.NET 框架配置工具 (Mscorcfg.msc) | 提供图形界面以管理 .NET 框架安全策略和使用远程处理服务的应用程序。此工具还允许管理和配置全局程序集缓存中的程序集。 |
通过加载、注册程序集并将类型库生成、注册和安装到现有的 COM+ 1.0 应用程序中,将托管类添加到 Windows 2000 组件服务中。 | |
使用一种称为“远程处理”的技术帮助您编译与 XML Web services 进行通信的客户端应用程序。 | |
从公共语言运行库程序集生成类型库。 | |
将 COM 类型库中发现的类型定义转换成托管元数据格式的等同定义。 | |
从 Web 服务描述语言 (WSDL) 协定文件、XML 架构定义 (XSD) 架构文件和 .discomap 发现文档为 XML Web services 和 XML Web services 客户端生成代码。 | |
发现位于 Web 服务器上的 XML Web services 的 URL,并将与每个 XML Web services 相关的文档保存到本地磁盘上。 | |
生成的 XML 架构应遵从 WWW 联合会 (W3C) 提出的 XSD 语言。此工具可生成公共语言运行库类和 XSD 架构文件的 DataSet 类。 |
工具 | 说明 |
Microsoft CLR 调试器 (DbgCLR.exe) | 使用图形界面提供调试服务,以帮助应用程序开发人员查找和修复针对运行库的各类程序中的错误。 |
使用公共语言运行库“调试 API”提供命令行调试服务。用于查找和修复针对运行库的各类程序中的错误。 |
推荐文章参考:
http://www.zdnet.com.cn/developer/tech/story/0,2000081602,39056220-1,00.htm
终于完成了,希望对大家会有点帮助。好了,再见各位,下次见。(完)