(十九)程序集

来源:互联网 发布:淘宝待收货订单生成器 编辑:程序博客网 时间:2024/05/21 11:13

程序集是.net应用程序的部署单元,可以包含一个或多个程序集,通常扩展名为exe或dll.与本地exe和dll不同的是,它包含元数据,描述了程序集中定义的所有类型及其成员信息.还提供了程序集中文件的相关信息、版本信息和所使用的程序及信息.它是自我描述的安装单元

.net运行库允许一个进程中有多个CLR版本(2和4),多个应用程序域运行在一个进程中,而每个应用程序加载到一个应用程序域中,即多个应用程序运行在一个进程中,(可保证安全?通过不安全代码可访问整个进程空间.)


程序集结构

程序集元数据、类型元数据、MSIL代码、资源

程序集清单是元数据的一部分,描述了程序集和引用它所需要的所有信息,列出依赖关系,许可等.

程序集可以使用ILDASM查看,它是一个MSIL反汇编程序

动态加载使用Assembly类的静态方法Load();


动态编译C#代码

using System.Reflection;using System.IO;using System.CodeDom.Compiler;using Microsoft.CSharp;            CompilerResults results = null;            using (var provider = new CSharpCodeProvider())            {                var options = new CompilerParameters();                options.GenerateInMemory = true;                results = provider.CompileAssemblyFromSource(options, "int a;");            }            if (results.Errors.HasErrors == false)            {                var temp = Console.Out;                var writer = new StringWriter();                Console.SetOut(writer);                var driverType = results.CompiledAssembly.GetType("Driver");                driverType.InvokeMember("Run", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, null);                Console.SetOut(temp);                writer.ToString();            }


应用程序域

AppDomain类用于创建和终止应用程序域,加载和卸载程序集和类型,以及枚举应用程序域中的程序集和线程.

AppDomain.CurrentDomain.FriendlyName;//应用程序域名称AppDomain.CreateDomain("New AppDomain").ExecuteAssembly("AssemblyA.exe");//创建一个新的应用程序域,加载程序集AppDomain aDomain = AppDomain.CreateDomain("New AppDomain");aDomain.CreateInstance("AssmblyA", "Wrox.ProCSharp.Assemblies.Demo". true, BindingFlags.CreateInstance, null, new object[] {7,3},null,null);//加载程序集中类的实例

在运行库宿主上,会自动创建应用程序域,多数应用程序仅有默认的应用程序域,Asp.net为运行在Web服务器上的每个Web应用程序创建一个应用程序域.卸载程序集只能通过终止应用程序域来进行.


共享程序集

必须使用强名全局唯一地标识共享程序集,一般安装在全局程序集缓存(GAC)中.

使用本机映像生成器Ngen.exe,可以在安装期间把IL代码便以为本机代码,可增加程序启动速度.


0 0
原创粉丝点击