zoukankan      html  css  js  c++  java
  • MSIL实用指南-IL版hello world

    我们学习编程开始时,一般用输出"hello world"的一段程序。

    C#版的"hello world"是

    using System;
    
    namespace L01_HelloDemo
    {
        class HelloWorld
        {
            class Hello
            {
                public static void Main2()
                {
                    Console.WriteLine("Hello World!");
                    Console.ReadKey();
                }
            }
        }
    }
    

    用生成IL方式也可以输出"hello world",它的实现源码是

    using System;
    using System.Reflection;
    using System.Reflection.Emit;
    
    namespace L01_HelloDemo
    {
        class HelloWorldILGenerator
        {
            static string binaryName = "ILHelloWorldDemo.exe";
            static string namespaceName = "ILHelloWorldDemo";
            static string typeName = "HelloWorld";
            
            static AssemblyBuilder assemblyBuilder;
            static ModuleBuilder moduleBuilder;
            static TypeBuilder typeBuilder;
    
            public static void Generate()
            {
                InitAssembly();
    
                /* 生成 public class HelloWorld */
                typeBuilder = moduleBuilder.DefineType(typeName, TypeAttributes.Public);
    
                /* 生成 public static void Main() */
                MethodBuilder mainMethod = typeBuilder.DefineMethod("Main",MethodAttributes.Public | MethodAttributes.Static, typeof(void), new Type[] { });
                ILGenerator methIL = mainMethod.GetILGenerator();
    
                /* 生成 Console.WriteLine("Hello World!"); */
                MethodInfo writeLineMethod = typeof(Console).GetMethod("WriteLine",new Type[]{ typeof(string) });
                methIL.Emit(OpCodes.Ldstr, "Hello World!");
                methIL.Emit(OpCodes.Call, writeLineMethod);
    
                /* 生成 Console.ReadKey(); */
                MethodInfo readKeyMethod = typeof(Console).GetMethod("ReadKey", new Type[] { });
                methIL.Emit(OpCodes.Call, readKeyMethod);
                methIL.Emit(OpCodes.Pop);
    
                methIL.Emit(OpCodes.Ret);
    
                /*  设置assembly入口方法 */
                assemblyBuilder.SetEntryPoint(mainMethod, PEFileKinds.ConsoleApplication);
    
                SaveAssembly();
                Console.WriteLine("生成成功");
                Console.ReadKey();
            }
    
            static void InitAssembly()
            {
                AssemblyName assemblyName = new AssemblyName(namespaceName);
                assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
                moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, binaryName);
            }
    
            static void SaveAssembly()
            {
                Type t = typeBuilder.CreateType(); //完成Type,这是必须的
                assemblyBuilder.Save(binaryName);
            }
        }
    }

    调用 HelloWorldILGenerator.Generate()后生成ILHelloWorldDemo.exe文件,打开它运行的效果和C#版的"hello world"的是一样的,

    用ILSpy对ILHelloWorldDemo.exe进行反编译,反编译的源码也和和C#版的"hello world"的是一样的。

  • 相关阅读:
    Unity3D 开发之shader教程(浅谈光照之漫反射diffuse)
    游戏引擎浅析
    Unity3D 中的三个Update()方法
    Unity 游戏存档 PlayerPrefs类的用法
    unity3d中 刚体(Rigidbody) 碰撞体(Collider) 触发器(Is Trigger)
    Unity 3D制作2D游戏的几种方法
    Unity3D 常用插件
    Unity3D协同程序(Coroutine)
    Unity中 动态加载 Resources.Load()和Asset Bundle 的区别
    Unity3D 游戏开发之内存优化
  • 原文地址:https://www.cnblogs.com/tkt2016/p/8565877.html
Copyright © 2011-2022 走看看