举例在项目中动态构建自己的程序集,.NET产生动态程序集!
买了园子里面专家写的一本书,你必须知道的.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产生动态程序集!相关推荐
- vue项目中所使用的element-UI / echarts
高清版思维导图见后台管理项目地址 1.login登录页面 < el-form >表单 在 Form 组件中,每一个表单域由一个 Form-Item 组件构成,表单域中可以放置各种类型的表单 ...
- Jenkins 中定时任务构建
一般,在Jenkins中搭建项目完成后,项目可正常运行,基本都会进行定时任务的构建.特别是重要的接口,进行关键接口自动化的日常巡检 时,基本都会设置成定时任务,以方便每天,接口的自动化,可及时检查接口 ...
- 关于Android项目中的Toast那些动画实现方式
最近产品给了一个竞品App的Toast动画,希望开发可以去实现它,经过一段时间的深(不)思(停)熟(百)虑(度)之后,发现事情其实并不简单,所以这里记录一下关于Android~Toast动画实现的相关 ...
- Android之项目中如何用好构建神器Gradle?
Gradle虽为构建神器,但感觉学习曲线比较陡峭.Gradle User Guide内容很多,但有点太多了,多的你看不完,Gradle Plugin User Guide一篇文章主要讲了Android ...
- 在Maven+Spring项目中使用Node.js的Gulp进行前端自动化构建
摘要: 在Maven+Spring项目中使用Node.js的Gulp进行前端自动化构建 刚开始打算进行前后端分离开发,后来发现在使用JSP或者Freemarker做动态页面时,想发挥这些自动化构建工具 ...
- Android项目中如何用好构建神器Gradle?
摘要:本文作者贾吉鑫为大众点评Android工程师,在进行团队并行开发时,分库遇到的问题很多都要通过Gradle脚本解决.Gradle虽为构建神器,但学习曲线比较陡峭,要想在Android项目中用好G ...
- java 动态加载ztree_JAVAEE——BOS物流项目02:学习计划、动态添加选项卡、ztree、项目底层代码构建...
1 学习计划 1.jQuery easyUI中动态添加选项卡 2.jquery ztree插件使用 n 下载ztree n 基于标准json数据构造ztree n 基于简单json数据构造ztree( ...
- vue项目中动态创建模块以满足客户定制化需求的解决方案
前端项目中很多时候会遇到这样的业务需求: 所有的客户都有共同的一些业务需求,即基础需求 基础需求需要根据业务发展进行升级 在共同需求的基础上,每个客户又有不同的需求(客制化) 如果只是一两个客户还好, ...
- web项目中填写sql信息自动动态生成报表功能(springboot)
(一)大概 背景: 需求就是设计一个自定义报表功能,当需要新报表时,能够快速的构建. 经过初步的构思,有至少三种方式可以实现: 构建demo代码,一个报表对应编写一套代码,不过可以将重复代码提取,尽可 ...
- 独家 | 构建端到端数据科学项目,从我的Data Scientist Ideal Profiles项目中学习(附链接)...
翻译:张睿毅 校对:吴金笛 本文约1500字,建议阅读5分钟. 本文为你介绍了构建数据科学项目中重要的思维能力及训练建议. Joseph Barrientos 拍照于 Unsplash (链接:htt ...
最新文章
- 大赛季(2020)新一代信息技术行业赛赛事公告
- Listview 多个ViewHolder实现
- 07/11/20 资料整理
- Kotlin学习笔记-----函数的定义
- access开发精要(9)-排序
- 用 Mahout 和 Elasticsearch 实现推荐系统
- mysql2008无法登陆_SQL2008不能登录实例
- android如何让gps服务停止,android – 启动/停止GPS(或位置服务)时接收通知(通过BroadcastReceiver)...
- Vscode多个窗口显示多个选项卡/Tabs
- 操作系统android9.0,三星公布了升级Android9.0操作系统的时间表
- liunux 查看系统参数、网络参数的命令
- CCF 区块链国际会议 统计 有哪些接收区块链论文的会议 (最全)
- 小程序如何开通流量主
- Vegas怎么制作古装墨迹笔刷开场效果
- 基尔霍夫电流定律KCL,基尔霍夫电压定律KVL
- mysql删除视图sql语句_怎么样删除视图中的全部数据 用SQL语言编写。
- 【docker安装】docker安装与部署
- DataEase看中国 - 中国影星“成龙”电影票房数据分析
- 【让安卓手机快速接通笔记本WIFI的小技巧】
- 【TarDAL红外与可见光图像融合论文笔记】
热门文章
- 利用caffe日志进行测试精度训练损失等的画图(caffe训练结果可视化)
- 构建一个简单的Keras +深度学习REST API
- python---set集合
- 8数据提供什么掩膜产品_英特尔推出多款数据中心产品:继续提供差异化选项...
- Kubernetes 小白学习笔记(29)--kubernetes云原生应用开发-基于Elasticsearch技术栈搭建Kubernetes的集群Logging设施
- IPFS python api 示例
- java对读写文件进行操作
- 东北师范大学计算机应用19离线作业,东北师范大学《计算机应用基础》离线作业及答案...
- $(#).html(ftl) js 动态引入宏定义,FTL惯用标签及语法
- python集合的操作符_【python新手入门必备——集合与集合操作符】- 环球网校