zoukankan      html  css  js  c++  java
  • 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 = 1;
                byte b = 255;
                int num2;
                switch (Hexadecimal.Length)
                {
                    case 4:
                        num2 = 1;
                        text = "F";
                        goto IL_9D;
                    case 5:
                        num2 = 1;
                        text = "F";
                        b = Convert.ToByte(Hexadecimal.Substring(num, num2) + text, 16);
                        num += num2;
                        goto IL_9D;
                    case 7:
                        num2 = 2;
                        goto IL_9D;
                    case 9:
                        num2 = 2;
                        b = Convert.ToByte(Hexadecimal.Substring(num, num2) + text, 16);
                        num += num2;
                        goto IL_9D;
                }
                num2 = 2;
                Hexadecimal = "#FFFFFF";
            IL_9D:
                byte b2 = Convert.ToByte(Hexadecimal.Substring(num, num2) + text, 16);
                byte b3 = Convert.ToByte(Hexadecimal.Substring(num += num2, num2) + text, 16);
                byte b4 = Convert.ToByte(Hexadecimal.Substring(num + num2, num2) + text, 16);
                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, 1);
                MyILGenerator.Emit(OpCodes.Stloc_1);
                MyILGenerator.Emit(OpCodes.Ldc_I4, 0XFF);
                MyILGenerator.Emit(OpCodes.Stloc_2);
                MyILGenerator.Emit(OpCodes.Ldarg, 0);//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[0]);
                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, 16);
                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[1]);
                MyILGenerator.Emit(OpCodes.Ldc_I4_2);
                MyILGenerator.Emit(OpCodes.Stloc_3);
                //MyILGenerator.Emit(OpCodes.Br_S, endOfMethod);
                MyILGenerator.MarkLabel(jumpTable[2]);
                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, 16);
                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[3]);
                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, 16);
                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, 16);
                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, 16);
                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
            }
        }
    
    
    
     
  • 相关阅读:
    每个部门都有自己的游戏规则
    ssh作为代理,反向登录没有固定公网ip的局域网内的某远程服务器
    x11vnc 作为远程桌面服务器时vnc客户端键盘无法长按连续输入字符
    vim 编译使用ycm启动问题 fixed
    ubuntu设置普通用户也能执行docker命令
    git常见使用
    切图的必要步骤
    css居中
    清除浮动
    Spring-AOP(2)
  • 原文地址:https://www.cnblogs.com/yuming1983/p/3702404.html
Copyright © 2011-2022 走看看