///publicstaticColorHexadecimalToArgb(stringHexadecimal){stringtext=string.Empty;intnum=1;byteb=255;intnum" />

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

系统 1677 0
      
            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
        
        
          

        }

    }
        
      
    

 

      
         
      
    

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论