程序集和反射
今天主要讨论程序集和反射的用方法
程序集:
程序集元素局包括Win32文件首部、CLR文件首部和程序集清单
Win32文件首部
01. 使程序集可以被Windows操作系统加载和操作
02. 标识应用程序在Windows操作系统中的类型(是控制台,图形界面还是web页面)
03. 使用dumpbin.exe工具和 /headers标记浏览程序集的Win32文件首部信息
例如:dumpbin Test.exe /headers
CLR文件首部
其定义了多个标记,使得运行库了解托管文件的布局
使用dumpin.exe工具和/clrheader标记浏览程序集内部的CLR首部信息
程序集清单
清单是用来描述程序集中元素的相互关系以及程序集正常工作时需要依赖其他哪些程序集的元数据
CIL代码
运行中,程序集内部的CIL代码被编译为指平台和CPU的指令
类型元数据:
完整描述程序集内含类型和引用外部类型的格式
程序集资源
程序集资源指定的.NET程序集可以包含一些嵌入资源,如图表,图像和声音等。
程序集可以是dll文件,也可是是EXE文件
构建和使用程序集
案例:构建程序集,并且使用该程序集
01,我们创建一个Ctop类库项目,在该类库项目中包含StrToPinyin类,类中有一个GetChineseSpell方法,方法原型如下:
02,创建一个WinForm应用程序LibraryTest来引用该程序集
引用步骤:首先右键添加引用
然后通过using Ctop引入对应的程序集。
03,在txtChinese的KeyUp事件中编写如下代码
这样我们就实现了对程序集中方法的调用。
反编译查看程序的信息
常见标记的含义:
共享程序集
共享程序集是类型和资源的结合,如果我们需要一个机器级别的类库,就应该将其部署为共享程序集。在部署共享程序集到GAC之前,必须为其赋予一个强名称。
强名称:
强名称是由程序集的标识加上公钥和数字签名组成的,其中,程序集的标识包括简单文本名称、版本号和区域性信息(如果提供的话)。它使用对应的私钥从程序集文件中生成。(程序集文件包含程序集清单,其中包含组成程序集的所有文件的名称和哈希。)
具有强名称的程序集只能使用其他具有强名称的程序集的类型。否则将会危及到该具有强名称的程序集的安全。
为程序集设置强名称:
反射的定义:
反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。
反射的机制
通过Assembly类获取该程序集下所有的模块,然后获取对应模块下的类型,然后获取该类型下对应的方法、属性和事件等。具体代码如下:
Assembly assembly= Assembly.LoadFrom(@"F:\ASP.NET学习开始\多线程\CSharp基础\Ctop\bin\Debug\Ctop.dll");
Module[] modules = assembly.GetModules();
foreach (Module module in modules)
{
Type[] types = module.GetTypes();
foreach (Type type in types)
{
Console.WriteLine(type.Name);
//反射出对应类型下的所有方法
MethodInfo[] methodInfos = type.GetMethods();
foreach (MethodInfo methodInfo in methodInfos)
{
Console.WriteLine(methodInfo.Name);
}
Console.WriteLine("method==============");
}
Console.WriteLine("============");
}
Console.ReadKey();
好了,对程序集和反射的内容先介绍到这里。