买了园子里面专家写的一本书,你必须知道的.NET把第2部分本质-.NET深入浅出.讲述CIL中间语言的部分详细认真的阅读完后,对.NETCLR的运行以及底层的了解随之加深,并把以前项目中运用到的需要产生动态程序集有熟悉了一遍!写了个简单的例子!只有对CIL有所熟悉之后才能对动态产生程序集这项技术下手,

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection.Emit;
using System.Reflection;
using System.Threading;
namespace _5_CIL
{
    /// <summary>
    /// 产生动态程序集
    /// 陶勇强
    /// </summary>
    ///要动态构造的程序集的类
    ///public class HelloWord
   /// {
   ///   private string theMessage;
   ///   public HelloWord()
   ///   { }
   ///   public HelloWord(string s)
   ///   {
   ///      theMessage = s;
   ///   }
   ///   public string GetMsg()
   ///   {
   ///      return theMessage;
  ///    }
  ///    public void SayHello()
  ///    {
  ///       Console.WriteLine("欢迎来到我的HelloWord类!");
  ///    }
  ///  }
   
    /// <summary>
    /// 下面的代码动态产生程序集<创建上面的类>
    /// </summary>
    class Program
    {
        /// <summary>
        /// 动态创建程序集,调用传入一个AppDomain类型
        /// </summary>
        /// <param name="args"></param>
        public static void CreateMyAsm(AppDomain curAppDomain)
        {
            //创建通用的程序集特征
            AssemblyName assemblyName = new AssemblyName();
            assemblyName.Name = "MyAssembly";
            assemblyName.Version = new Version("1.0.0.0");

//在当前程序域中创建一个新的程序集
            AssemblyBuilder assembly = curAppDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Save);

//本人创造的是一个单文件程序集,模块的名字就是程序集的名字
            ModuleBuilder module = assembly.DefineDynamicModule("MyAssembly", "MyAssembly.dll");
           
            //定义一个公共类HelloWord
            TypeBuilder helloWorldClass = module.DefineType("MyAssembly.HelloWorld", TypeAttributes.Public);
           
            //定义一个私有字符串类型成员
            FieldBuilder msgfield = helloWorldClass.DefineField("theMessage", Type.GetType("System.String"),
                FieldAttributes.Private);

//构件一个自定义构造函数
            Type[] constructorAers = new Type[1];
            constructorAers[0] = typeof(string);
            ConstructorBuilder conster = helloWorldClass.DefineConstructor(MethodAttributes.Public,
            CallingConventions.Standard, constructorAers);

//产生必要的CIL代码到构造函数
            ILGenerator contorIl = conster.GetILGenerator();
            contorIl.Emit(OpCodes.Ldarg_0);
            Type objectClass = typeof(object);
            ConstructorInfo super = objectClass.GetConstructor(new Type[0]);
            contorIl.Emit(OpCodes.Call, super);

//加载对象的this指针到栈上
            contorIl.Emit(OpCodes.Ldarg_0);

//加载输入参数到栈上
            contorIl.Emit(OpCodes.Ldarg_1);
            contorIl.Emit(OpCodes.Stfld, msgfield);
            contorIl.Emit(OpCodes.Ret);

//创建默认构造函数
            helloWorldClass.DefineDefaultConstructor(MethodAttributes.Public);

//创建GetMsg()方法
            MethodBuilder getMsgMethod = helloWorldClass.DefineMethod("GetMsg", MethodAttributes.Public, typeof(string), null);
            ILGenerator methodIl = getMsgMethod.GetILGenerator();
            methodIl.Emit(OpCodes.Ldarg_0);
            methodIl.Emit(OpCodes.Ldfld, msgfield);
            methodIl.Emit(OpCodes.Ret);

//创建SayHello()方法
            MethodBuilder getSayHelloMothod = helloWorldClass.DefineMethod("SayHello", MethodAttributes.Public, null, null);
            methodIl = getSayHelloMothod.GetILGenerator();
            methodIl.EmitWriteLine("欢迎来到我的HelloWord类!\n");
            methodIl.Emit(OpCodes.Ret);

//创建HelloWordClass类
            helloWorldClass.CreateType();

//保存创建的程序集
            assembly.Save("MyAssembly.dll");

}
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("动态生成程序集程序");

//得到当前域
                AppDomain curApp = Thread.GetDomain();

//构造创建动态程序集
                CreateMyAsm(curApp);
                Console.WriteLine("创建程序集,并加载新的程序集到文件\n");
                Assembly ass = Assembly.Load("MyAssembly");

//得到HelloWord类型
                Type hello = ass.GetType("MyAssembly.HelloWorld");

//创建HelloWord对象并调用构造函数        
                Console.Write("->请输入内容: ");
                string msg = Console.ReadLine();
                object[] cotro = new object[1];
                cotro[0] = msg;
                object obj = Activator.CreateInstance(hello, cotro);

//调用方法动态创建的程序集里面的HelloWord类里面的SayHello方法
                Console.WriteLine("->执行方法SayHello\n");
                MethodInfo mt = hello.GetMethod("SayHello");
                mt.Invoke(obj, null);

//调用GetMsg()方法
                Console.WriteLine("输出内容GetMsg()方法\n");
                mt = hello.GetMethod("GetMsg");
                Console.WriteLine(mt.Invoke(obj, null));
            }
            catch (Exception e)
            {
                throw e;
            }
        }
    }
}

转载于:https://www.cnblogs.com/tyq_520/archive/2008/11/29/1343618.html

举例在项目中动态构建自己的程序集,.NET产生动态程序集!相关推荐

  1. vue项目中所使用的element-UI / echarts

    高清版思维导图见后台管理项目地址 1.login登录页面 < el-form >表单 在 Form 组件中,每一个表单域由一个 Form-Item 组件构成,表单域中可以放置各种类型的表单 ...

  2. Jenkins 中定时任务构建

    一般,在Jenkins中搭建项目完成后,项目可正常运行,基本都会进行定时任务的构建.特别是重要的接口,进行关键接口自动化的日常巡检 时,基本都会设置成定时任务,以方便每天,接口的自动化,可及时检查接口 ...

  3. 关于Android项目中的Toast那些动画实现方式

    最近产品给了一个竞品App的Toast动画,希望开发可以去实现它,经过一段时间的深(不)思(停)熟(百)虑(度)之后,发现事情其实并不简单,所以这里记录一下关于Android~Toast动画实现的相关 ...

  4. Android之项目中如何用好构建神器Gradle?

    Gradle虽为构建神器,但感觉学习曲线比较陡峭.Gradle User Guide内容很多,但有点太多了,多的你看不完,Gradle Plugin User Guide一篇文章主要讲了Android ...

  5. 在Maven+Spring项目中使用Node.js的Gulp进行前端自动化构建

    摘要: 在Maven+Spring项目中使用Node.js的Gulp进行前端自动化构建 刚开始打算进行前后端分离开发,后来发现在使用JSP或者Freemarker做动态页面时,想发挥这些自动化构建工具 ...

  6. Android项目中如何用好构建神器Gradle?

    摘要:本文作者贾吉鑫为大众点评Android工程师,在进行团队并行开发时,分库遇到的问题很多都要通过Gradle脚本解决.Gradle虽为构建神器,但学习曲线比较陡峭,要想在Android项目中用好G ...

  7. java 动态加载ztree_JAVAEE——BOS物流项目02:学习计划、动态添加选项卡、ztree、项目底层代码构建...

    1 学习计划 1.jQuery easyUI中动态添加选项卡 2.jquery ztree插件使用 n 下载ztree n 基于标准json数据构造ztree n 基于简单json数据构造ztree( ...

  8. vue项目中动态创建模块以满足客户定制化需求的解决方案

    前端项目中很多时候会遇到这样的业务需求: 所有的客户都有共同的一些业务需求,即基础需求 基础需求需要根据业务发展进行升级 在共同需求的基础上,每个客户又有不同的需求(客制化) 如果只是一两个客户还好, ...

  9. web项目中填写sql信息自动动态生成报表功能(springboot)

    (一)大概 背景: 需求就是设计一个自定义报表功能,当需要新报表时,能够快速的构建. 经过初步的构思,有至少三种方式可以实现: 构建demo代码,一个报表对应编写一套代码,不过可以将重复代码提取,尽可 ...

  10. 独家 | 构建端到端数据科学项目,从我的Data Scientist Ideal Profiles项目中学习(附链接)...

    翻译:张睿毅 校对:吴金笛 本文约1500字,建议阅读5分钟. 本文为你介绍了构建数据科学项目中重要的思维能力及训练建议. Joseph Barrientos 拍照于 Unsplash (链接:htt ...

最新文章

  1. 大赛季(2020)新一代信息技术行业赛赛事公告
  2. Listview 多个ViewHolder实现
  3. 07/11/20 资料整理
  4. Kotlin学习笔记-----函数的定义
  5. access开发精要(9)-排序
  6. 用 Mahout 和 Elasticsearch 实现推荐系统
  7. mysql2008无法登陆_SQL2008不能登录实例
  8. android如何让gps服务停止,android – 启动/停止GPS(或位置服务)时接收通知(通过BroadcastReceiver)...
  9. Vscode多个窗口显示多个选项卡/Tabs
  10. 操作系统android9.0,三星公布了升级Android9.0操作系统的时间表
  11. liunux 查看系统参数、网络参数的命令
  12. CCF 区块链国际会议 统计 有哪些接收区块链论文的会议 (最全)
  13. 小程序如何开通流量主
  14. Vegas怎么制作古装墨迹笔刷开场效果
  15. 基尔霍夫电流定律KCL,基尔霍夫电压定律KVL
  16. mysql删除视图sql语句_怎么样删除视图中的全部数据 用SQL语言编写。
  17. 【docker安装】docker安装与部署
  18. DataEase看中国 - 中国影星“成龙”电影票房数据分析
  19. 【让安卓手机快速接通笔记本WIFI的小技巧】
  20. 【TarDAL红外与可见光图像融合论文笔记】

热门文章

  1. 利用caffe日志进行测试精度训练损失等的画图(caffe训练结果可视化)
  2. 构建一个简单的Keras +深度学习REST API
  3. python---set集合
  4. 8数据提供什么掩膜产品_英特尔推出多款数据中心产品:继续提供差异化选项...
  5. Kubernetes 小白学习笔记(29)--kubernetes云原生应用开发-基于Elasticsearch技术栈搭建Kubernetes的集群Logging设施
  6. IPFS python api 示例
  7. java对读写文件进行操作
  8. 东北师范大学计算机应用19离线作业,东北师范大学《计算机应用基础》离线作业及答案...
  9. $(#).html(ftl) js 动态引入宏定义,FTL惯用标签及语法
  10. python集合的操作符_【python新手入门必备——集合与集合操作符】- 环球网校