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 ...
随机推荐
- unix下输出重定向
> 为重定向符号 >> 重定向不覆盖原文件内容 example: 1. 标准输出重定向 echo "123" > /home/123.txt ---- 标准 ...
- Python学习路程day18
Python之路,Day18 - Django适当进阶篇 本节内容 学员管理系统练习 Django ORM操作进阶 用户认证 Django练习小项目:学员管理系统设计开发 带着项目需求学习是最有趣和效 ...
- 如何快速在当前目录打开cmd命令提示符
对于稍微熟悉电脑一些的朋友来说.cmd绝对是个很方便的东西.但是每次使用cmd都要cd半天才能到当前目录.怎么快速打开当前目录呢? 当前目录按住shift再右键.然后会看到右键菜单里有一个" ...
- IntelliJ IDEA手工安python装插件方法
IntelliJ IDEA手工安装插件方法 以IntelliJ IDEA 11.0.1安装python为例: (1)下载python插件地址:http://plugins.intellij.net/p ...
- CSS实现三角形
突然想起搞一把三角形. 简单来说: 建一个div 宽度.高度设为0 添加两个样式: border 和 border-color 如果需要一个三角形把其他边框都设为透明 transparent < ...
- Baskets of Gold Coins_暴力
Problem Description You are given N baskets of gold coins. The baskets are numbered from 1 to N. In ...
- mysql用户名密码忘记了解决方法
今天想用一下实验室服务器的mysql,发现不记得用户名密码了. 解决方法如下: 1. 保证服务器处于安全的状态,如果可以请拔掉网线...(不过我跳过了这一步,额) 2. 修改/etc/my.cnf文件 ...
- Makefile 学习&binutils工具集,软件开发利器
gcc -E 能有效的帮助我们解决与宏有关的编译错误: gcc -S能获得一个C源程序文件的汇编程序: gcc -v能获得系统头文件的路径 生成依赖关系: gcc -M gcc -MM 生成不包含系统 ...
- (原创)MongoDB之NoSQL简介
Nosql简介1.1系统对数据的需求 Nosql[Nosql主要用途大数据处理]的全称为”not only sql”,为非关系型数据库[非关系型数据库就是关系型数据库的所有特点都没有了, ...
- Python 程序员经常犯的 10 个错误
关于PythonPython是一种解释性.面向对象并具有动态语义的高级程序语言.它内建了高级的数据结构,结合了动态类型和动态绑定的优点,这使得... 关于Python Python是一种解释性.面向对 ...