(十九)程序集

程序集是.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代码便以为本机代码,可增加程序启动速度.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值