zoukankan      html  css  js  c++  java
  • .net里怎样在Main方法之前执行代码?

      众说周知,Main方法是.net程序的入口,那有什么方法可以在Main方法之前执行代码呢?研究过.net的高人也许已经知道了方法。

      为什么在.net中Main方法是程序入口呢?那么Main方法和其他非Main的方法有什么差异呢?看下面代码:

    public class Program
    {
        static void Main()
        {
            Console.WriteLine("Main");
        }
        static void OtherMain()
        {
            Console.WriteLine("OtherMain");
        }
    }

      Main()和OtherMain()方法就是输出的东西不一样,那我们再看一看两都的IL代码吧::

    .method private hidebysig static void  Main() cil managed
    {
      .entrypoint
      // 代码大小       13 (0xd)
      .maxstack  8
      IL_0000:  nop
      IL_0001:  ldstr      "Main"
      IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_000b:  nop
      IL_000c:  ret
    } // end of method Program::Main
    .method private hidebysig static void  OtherMain() cil managed
    {
      // 代码大小       13 (0xd)
      .maxstack  8
      IL_0000:  nop
      IL_0001:  ldstr      "OtherMain"
      IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_000b:  nop
      IL_000c:  ret
    } // end of method Program::OtherMain

      从两者的比较我们可以看出Main方法生成的IL代码多了一条“.entrypoint”的指令,.entrypoint”什么意思?随便一看就知道是“进入点”,就是程序入口的意思了,而且一个程序(exe,非dll,dll是没有的)只能找到一个.entrypoint”,不信你可以找找。要在Main方法之前执行代码我们只要如下代码的样子,把入口改为OtherMain即可:

    public class Program
    {
        static void Main()
        {
            Console.WriteLine("Main");
        }
        static void OtherMain()
        {
            Console.WriteLine("OtherMain");
            Main();
        }
    }

      编译,再用强大的反汇编程序——IL 反汇编程序打开编译好的exe文件,点击菜单文件》转储。保存后再用文件编辑工具打开(如notepad),将“.entrypoint”移动到OtherMain()的下面,保存,结果如下。

      .method private hidebysig static void  OtherMain() cil managed
      {
        .entrypoint
        // 代码大小       19 (0x13)
        .maxstack  8
        IL_0000:  nop
        IL_0001:  ldstr      "OtherMain"
        IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
        IL_000b:  nop
        IL_000c:  call       void Test.Program::Main()
        IL_0011:  nop
        IL_0012:  ret
      } // end of method Program::OtherMain

      用ilasm编译修改好的文件,生成exe,再运行。看看结束是什么,是不是在输出“Main”之前输出了“OtherMain"。如果是,那恭喜你,程序入口修改成功!大家可以动手试试。

      如果你觉得这种方法太麻烦了,那有个简单的方法。知道类型构造器(又称静态构造方法)吗?不知道?那先知道什么是类型构造器再看下面的。

      类型构造器会在类第一次被使用的初始化类,在类的其他代码被执行前执行。想要在Main方法之前执行代码只要在包含Main方法的类里加一个类型构造器不就可以了:

    public class Program
    {
        static Program()
        {
            Console.WriteLine("我执行了,Main方法还没执行哦!");
        }
        static void Main()
        {
            Console.WriteLine("Main");
        }
    }

      因为Main方法也是一个类的静态方法,也会符合CLR规范的。如果在类型构造器抛出一个异常,你知道会发生什么吗?

      如果高人还知道其他方法,可以在评论中留言。

  • 相关阅读:
    a[::-1]相当于 a[-1:-len(a)-1:-1],也就是从最后一个元素到第一个元素复制一遍。
    +=
    map 和reduce
    赋值语句
    高阶函数
    函数式编程
    迭代器
    如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:
    ie11升级的过程中遇到的问题以及解决办法
    .csporj 文件部分节点解析
  • 原文地址:https://www.cnblogs.com/qhca/p/2459109.html
Copyright © 2011-2022 走看看