ILGenerator.Emit动态 MSIL编程(二)之基础
public sealed class ColorToArgb
{
/// <summary>
/// 将十六进制转化为AGRB
/// </summary>
/// <param name="Hexadecimal"></param>
/// <returns></returns>
public static Color HexadecimalToArgb(string Hexadecimal)
{ string text = string.Empty;
int num = ;
byte b = ;
int num2;
switch (Hexadecimal.Length)
{
case :
num2 = ;
text = "F";
goto IL_9D;
case :
num2 = ;
text = "F";
b = Convert.ToByte(Hexadecimal.Substring(num, num2) + text, );
num += num2;
goto IL_9D;
case :
num2 = ;
goto IL_9D;
case :
num2 = ;
b = Convert.ToByte(Hexadecimal.Substring(num, num2) + text, );
num += num2;
goto IL_9D;
}
num2 = ;
Hexadecimal = "#FFFFFF";
IL_9D:
byte b2 = Convert.ToByte(Hexadecimal.Substring(num, num2) + text, );
byte b3 = Convert.ToByte(Hexadecimal.Substring(num += num2, num2) + text, );
byte b4 = Convert.ToByte(Hexadecimal.Substring(num + num2, num2) + text, );
return Color.FromArgb(b, b2, b3, b4);
}
}
class Program
{
static void Main(string[] args)
{
#region
var asmName = new AssemblyName("Test");
var asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);//创建程序集
var mdlBldr = asmBuilder.DefineDynamicModule("Test", "Test.dll");//定义模块
var typeBldr = mdlBldr.DefineType("ColorToArgb", TypeAttributes.Public|TypeAttributes.Class|TypeAttributes.Sealed);//定义类
var methodBldr = typeBldr.DefineMethod("HexadecimalToArgb", MethodAttributes.Public,CallingConventions.Standard,
typeof(Color), new Type[] { typeof(string) });//定义方法
var MyILGenerator = methodBldr.GetILGenerator();//获取il生成器
MyILGenerator.DeclareLocal(typeof(string));//注册变量 string text
MyILGenerator.DeclareLocal(typeof(int));//int num ;
MyILGenerator.DeclareLocal(typeof(byte));//byte b;
MyILGenerator.DeclareLocal(typeof(int));//int num2;
var b2 = MyILGenerator.DeclareLocal(typeof(byte));
var b3 = MyILGenerator.DeclareLocal(typeof(byte));
var b4 = MyILGenerator.DeclareLocal(typeof(byte));
var color = MyILGenerator.DeclareLocal(typeof(Color)); #endregion
#region
//Label defaultCase = MyILGenerator.DefineLabel();
Label endOfMethod = MyILGenerator.DefineLabel();
Label forLabel = MyILGenerator.DefineLabel();
Label[] jumpTable = new Label[] { MyILGenerator.DefineLabel(),MyILGenerator.DefineLabel(),
MyILGenerator.DefineLabel(), MyILGenerator.DefineLabel() };
MyILGenerator.Emit(OpCodes.Ldsfld, string.Empty); //压栈赋值
MyILGenerator.Emit(OpCodes.Stloc_0);
MyILGenerator.Emit(OpCodes.Ldc_I4, );
MyILGenerator.Emit(OpCodes.Stloc_1);
MyILGenerator.Emit(OpCodes.Ldc_I4, 0XFF);
MyILGenerator.Emit(OpCodes.Stloc_2);
MyILGenerator.Emit(OpCodes.Ldarg, );//Ldarg是加载方法参数的意思。这里arg_0事实上是对当前对象的引用即this
MyILGenerator.Emit(OpCodes.Callvirt, typeof(string).GetProperty("Length").GetGetMethod());
LocalBuilder length = MyILGenerator.DeclareLocal(typeof(int));
MyILGenerator.Emit(OpCodes.Stloc_S, length);
MyILGenerator.Emit(OpCodes.Ldloc_S, length);
MyILGenerator.Emit(OpCodes.Ldc_I4_4);
MyILGenerator.Emit(OpCodes.Sub);
MyILGenerator.Emit(OpCodes.Switch,jumpTable);
//MyILGenerator.Emit(OpCodes.Br_S, defaultCase);
MyILGenerator.MarkLabel(jumpTable[]);
MyILGenerator.Emit(OpCodes.Ldc_I4_1);
MyILGenerator.Emit(OpCodes.Stloc_3); MyILGenerator.Emit(OpCodes.Ldstr, "F");
MyILGenerator.Emit(OpCodes.Stloc_0);
MyILGenerator.Emit(OpCodes.Ldarg_0);
MyILGenerator.Emit(OpCodes.Ldloc_1);
MyILGenerator.Emit(OpCodes.Ldloc_3);
MyILGenerator.Emit(OpCodes.Callvirt, typeof(string).GetMethod("Substring", new Type[] { typeof(Int32), typeof(Int32) }));
MyILGenerator.Emit(OpCodes.Ldloc_0);
MyILGenerator.Emit(OpCodes.Call, typeof(string).GetMethod("Concat", new Type[] { typeof(string), typeof(string) }));
MyILGenerator.Emit(OpCodes.Ldc_I4_S, );
MyILGenerator.Emit(OpCodes.Call, typeof(Convert).GetMethod("ToByte", new Type[] { typeof(string), typeof(Int32) }));
MyILGenerator.Emit(OpCodes.Stloc_2);
MyILGenerator.Emit(OpCodes.Ldloc_1);
MyILGenerator.Emit(OpCodes.Ldloc_3);
MyILGenerator.Emit(OpCodes.Add);
MyILGenerator.Emit(OpCodes.Stloc_1);
//MyILGenerator.Emit(OpCodes.Br_S, endOfMethod);
MyILGenerator.MarkLabel(jumpTable[]);
MyILGenerator.Emit(OpCodes.Ldc_I4_2);
MyILGenerator.Emit(OpCodes.Stloc_3);
//MyILGenerator.Emit(OpCodes.Br_S, endOfMethod);
MyILGenerator.MarkLabel(jumpTable[]);
MyILGenerator.Emit(OpCodes.Ldc_I4_2);
MyILGenerator.Emit(OpCodes.Stloc_3);
MyILGenerator.Emit(OpCodes.Ldarg_0);
MyILGenerator.Emit(OpCodes.Ldloc_1);
MyILGenerator.Emit(OpCodes.Ldloc_3);
MyILGenerator.Emit(OpCodes.Callvirt, typeof(string).GetMethod("Substring", new Type[] { typeof(Int32), typeof(Int32) }));
MyILGenerator.Emit(OpCodes.Ldloc_0);
MyILGenerator.Emit(OpCodes.Call, typeof(string).GetMethod("Concat", new Type[] { typeof(string), typeof(string) }));
MyILGenerator.Emit(OpCodes.Ldc_I4_S, );
MyILGenerator.Emit(OpCodes.Call, typeof(Convert).GetMethod("ToByte", new Type[] { typeof(string), typeof(Int32) }));
MyILGenerator.Emit(OpCodes.Stloc_2);
MyILGenerator.Emit(OpCodes.Ldloc_1);
MyILGenerator.Emit(OpCodes.Ldloc_3);
MyILGenerator.Emit(OpCodes.Add);
MyILGenerator.Emit(OpCodes.Stloc_1);
//MyILGenerator.Emit(OpCodes.Br_S, endOfMethod);
MyILGenerator.MarkLabel(jumpTable[]);
MyILGenerator.Emit(OpCodes.Ldc_I4_2);
MyILGenerator.Emit(OpCodes.Stloc_3);
MyILGenerator.Emit(OpCodes.Ldstr, "#FFFFFF");
MyILGenerator.Emit(OpCodes.Starg_S);//, "Hexadecimal");
MyILGenerator.Emit(OpCodes.Ldarg_0);
MyILGenerator.Emit(OpCodes.Ldloc_1);
MyILGenerator.Emit(OpCodes.Ldloc_3);
MyILGenerator.Emit(OpCodes.Callvirt, typeof(string).GetMethod("Substring", new Type[] { typeof(Int32), typeof(Int32) })); MyILGenerator.Emit(OpCodes.Ldloc_0);
MyILGenerator.Emit(OpCodes.Call, typeof(string).GetMethod("Concat", new Type[] { typeof(string), typeof(string) }));
MyILGenerator.Emit(OpCodes.Ldc_I4_S, );
MyILGenerator.Emit(OpCodes.Call, typeof(Convert).GetMethod("ToByte", new Type[] { typeof(string), typeof(Int32) }));
MyILGenerator.Emit(OpCodes.Stloc_S, b2);
MyILGenerator.Emit(OpCodes.Ldarg_0);
MyILGenerator.Emit(OpCodes.Ldloc_1);
MyILGenerator.Emit(OpCodes.Ldloc_3);
MyILGenerator.Emit(OpCodes.Add);
MyILGenerator.Emit(OpCodes.Dup);
MyILGenerator.Emit(OpCodes.Stloc_1);
MyILGenerator.Emit(OpCodes.Ldloc_3);
MyILGenerator.Emit(OpCodes.Callvirt, typeof(string).GetMethod("Substring", new Type[] { typeof(Int32), typeof(Int32) }));
MyILGenerator.Emit(OpCodes.Ldloc_0);
MyILGenerator.Emit(OpCodes.Call, typeof(string).GetMethod("Concat", new Type[] { typeof(string), typeof(string) }));
MyILGenerator.Emit(OpCodes.Ldc_I4_S, );
MyILGenerator.Emit(OpCodes.Call, typeof(Convert).GetMethod("ToByte", new Type[] { typeof(string), typeof(Int32) }));
MyILGenerator.Emit(OpCodes.Stloc_S, b3);
MyILGenerator.Emit(OpCodes.Ldarg_0);
MyILGenerator.Emit(OpCodes.Ldloc_1);
MyILGenerator.Emit(OpCodes.Ldloc_3);
MyILGenerator.Emit(OpCodes.Add);
MyILGenerator.Emit(OpCodes.Ldloc_3);
MyILGenerator.Emit(OpCodes.Callvirt, typeof(string).GetMethod("Substring", new Type[] { typeof(Int32), typeof(Int32) }));
MyILGenerator.Emit(OpCodes.Ldloc_0);
MyILGenerator.Emit(OpCodes.Call, typeof(string).GetMethod("Concat", new Type[] { typeof(string), typeof(string) }));
MyILGenerator.Emit(OpCodes.Ldc_I4_S, );
MyILGenerator.Emit(OpCodes.Call, typeof(Convert).GetMethod("ToByte", new Type[] { typeof(string), typeof(Int32) }));
MyILGenerator.Emit(OpCodes.Stloc_S, b4);
MyILGenerator.Emit(OpCodes.Ldloc_2);
MyILGenerator.Emit(OpCodes.Stloc_S, b2);
MyILGenerator.Emit(OpCodes.Stloc_S, b3);
MyILGenerator.Emit(OpCodes.Stloc_S, b4);
MyILGenerator.Emit(OpCodes.Call, typeof(Color).GetMethod("FromArgb", new Type[] { typeof(Int32), typeof(Int32), typeof(Int32), typeof(Int32) }));
MyILGenerator.Emit(OpCodes.Stloc_S, color);
MyILGenerator.Emit(OpCodes.Br_S, forLabel);
MyILGenerator.MarkLabel(forLabel);
MyILGenerator.Emit(OpCodes.Ldloc_S, color);
MyILGenerator.Emit(OpCodes.Ret);
typeBldr.CreateType();
asmBuilder.Save("Test.dll");//方便反编译 看代码写的对不对
#endregion
}
}
ILGenerator.Emit动态 MSIL编程(二)之基础的更多相关文章
- ILGenerator.Emit动态 MSIL编程(一)之基础
首先在Framework中,Emit相关的类基本都存在于System.Reflection.Emit命名空间下.可见Emit是作为反射的一个元素存在的. Emit能够实现什么?为什么要学习Emit?首 ...
- ILGenerator.Emit动态 MSIL编程(三)之动态代理
using System; using System.Linq; using System.Reflection; using System.Reflection.Emit; public seale ...
- 量子计算机编程(二)——QPU基础函数
第二部分主要是QPU的基础功能,第一部分就像是我们有了哪些基本的语句,第二部分就是我们能写一些简单基础的函数,一些小模块,第三部分就是他的应用了. 先来看一下一个简单量子应用的结构: 第一步,将量子态 ...
- Java并发编程 (二) 并发基础
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.CPU多级缓存-缓存一致性 1.CPU多级缓存 上图展示的是CPU高级缓存的配置,数据的读取和存 ...
- C# 使用Emit实现动态AOP框架 (二)
目 录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...
- 秒懂C#通过Emit动态生成代码 C#使用Emit构造拦截器动态代理类
秒懂C#通过Emit动态生成代码 首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new Assembly ...
- 【原创】高性能网络编程(二):上一个10年,著名的C10K并发连接问题
1.前言 对于高性能即时通讯技术(或者说互联网编程)比较关注的开发者,对C10K问题(即单机1万个并发连接问题)应该都有所了解."C10K"概念最早由Dan Kegel发布于其个人 ...
- WIN 下的超动态菜单(二)用法
WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/ ...
- C# Emit动态代理生成一个实体对象
/// <summary> /// 使用Emit动态代理收集实体信息 /// </summary> /// <typeparam name="T"&g ...
随机推荐
- jQuery的使用
一.基本简介 1.下载:http://jquery.com提供了最新的jQuery框架下载.通常只需下载最小的jQuery包(Minified)即可. ( 目前最新的版本jquery-1.3.2.mi ...
- Linux Shell shortcut
Ctrl+a跳到第一个字符前Ctrl+x同上但再按一次会从新回到原位置 Details see below: Linux shell shortcut
- 排球积分规则功能说明书(spec)
排球规则: 由技术性规定.非技术性规定和场地设备要求等方面的内容组成的.每场比赛仍为五局三胜,前四局每局先得25分为胜,第五局先得15分者为胜.当出现24平或14平时,要继续比赛至领先2分才能取胜. ...
- PHPstorm--ThinkStorm安装
原文地址 http://www.thinkphp.cn/topic/34518.html QQ群: 320655679: 因为公司在使用Ide,来帮助开发,PHPstorm最近很流行,因为他有很多插 ...
- nginx做nodejs(express等通用)反向代理
首先配置环境nginx+nodejs...(没有请看我的其他文章,此处不重复) cd 到nginx的site-available目录 ubuntu的在 cd /etc/nginx/site-avail ...
- gulp问题
刚刚又碰到gulp的一个小问题,就是改变src下的index.scss时碰到问题后监听就会立即停止,这很蛋疼: 解决办法就是在gulpfile.js中做一点改变:
- Flash动画
Flash (交互式矢量图和Web动画标准) Flash是由macromedia公司推出的交互式矢量图和 Web 动画的标准,由Adobe公 司收购.做Flash动画的人被称之为闪客.网页设计者使用 ...
- ThinkPHP M函数疑点
模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型层的名称(默认定义是Model),例如: 模型名 约定对应数据表(假设数据库的前缀定义是 think_) User ...
- 利用win服务定时为网卡启用/禁用
上周,Boss和我说,他儿子夜里爬起来用笔记本在被窝里玩CF,问路由器可以解决么,我看了是TPLINK的普通家用无线路由器,不支持禁用CF客户端网游,可以通过配置端口屏蔽什么的,但是白天又要开启,想想 ...
- mvc4 部署http错误403.14 forbidden
1. 检查服务器上是否安装了“HTTP重定向”功能和“静态内容压缩”功能(在添加/删除程序或增加角色处安装).这是我所遇到的问题:2. 应用程序池要被配置为“集成”3. 把.net 4.0安装在iis ...