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编程(二)之基础的更多相关文章

  1. ILGenerator.Emit动态 MSIL编程(一)之基础

    首先在Framework中,Emit相关的类基本都存在于System.Reflection.Emit命名空间下.可见Emit是作为反射的一个元素存在的. Emit能够实现什么?为什么要学习Emit?首 ...

  2. ILGenerator.Emit动态 MSIL编程(三)之动态代理

    using System; using System.Linq; using System.Reflection; using System.Reflection.Emit; public seale ...

  3. 量子计算机编程(二)——QPU基础函数

    第二部分主要是QPU的基础功能,第一部分就像是我们有了哪些基本的语句,第二部分就是我们能写一些简单基础的函数,一些小模块,第三部分就是他的应用了. 先来看一下一个简单量子应用的结构: 第一步,将量子态 ...

  4. Java并发编程 (二) 并发基础

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.CPU多级缓存-缓存一致性 1.CPU多级缓存 ​ 上图展示的是CPU高级缓存的配置,数据的读取和存 ...

  5. C# 使用Emit实现动态AOP框架 (二)

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  6. 秒懂C#通过Emit动态生成代码 C#使用Emit构造拦截器动态代理类

    秒懂C#通过Emit动态生成代码   首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new Assembly ...

  7. 【原创】高性能网络编程(二):上一个10年,著名的C10K并发连接问题

    1.前言 对于高性能即时通讯技术(或者说互联网编程)比较关注的开发者,对C10K问题(即单机1万个并发连接问题)应该都有所了解."C10K"概念最早由Dan Kegel发布于其个人 ...

  8. WIN 下的超动态菜单(二)用法

    WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/     ...

  9. C# Emit动态代理生成一个实体对象

    /// <summary> /// 使用Emit动态代理收集实体信息 /// </summary> /// <typeparam name="T"&g ...

随机推荐

  1. Flask + WSGI + Nginx 云部署

    这几天学着用flask写一些rest api,然后部署到云上.这个过程虽然网上有很多的教程,但还是遇到不少的问题! 采用flask的原因是因为它比较容易上手吧.用flask有专门restful api ...

  2. Ubuntu 64位下搭建ADT的种种问题

    我使用的adt版本为 adt-bundle-linux-x86_64-20140702.zip 1. Eclipse启动时提示 adb 无法加载动态链接库 libstdc++.so.6 以及  lib ...

  3. Noi2011 阿狸的打字机

    ..] of longint; e,q,fa,ps,pt,fail,ans:..] of longint; trie:..,..] of longint; c:..] of longint; s:.. ...

  4. @SuppressWarnings("finally")

    @SuppressWarnings.该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默.   批注允许您选择性地取消特定代码段(即,类或方法)中的警告.其中的想法是当您看到 ...

  5. HTTP简介

    HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议.. HT ...

  6. js去空格

    写成类的方法格式如下:(str.trim();) <script language="javascript"> String.prototype.trim=functi ...

  7. [GodLove]Wine93 Tarining Round #7

    比赛链接: http://vjudge.net/contest/view.action?cid=47643#overview 比赛来源: 2012 ACM/ICPC Asia Regional Han ...

  8. 浅析JSONP-解决Ajax跨域访问问题

    浅析JSONP-解决Ajax跨域访问问题 很久没有写随笔了,总是感觉没时间,其实时间就是...废话少说,前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现 ...

  9. maven打包不执行测试用例

    在执行maven打包时不需要执行测试用例,使用如下2种方式实现:-DskipTests=true : 不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下 ...

  10. 使用dbms_scheduler包创建定时任务

    本文使用dbms_scheduler的create_job创建执行存储过程的定时任务 创建一个job job_type指定'STORED_PROCEDURE' job_action中填入要执行的存储过 ...