好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

.net里怎样在Main方法之前执行代码

.net里怎样在Main方法之前执行代码

.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规范的。如果在类型构造器抛出一个异常,你知道会发生什么吗?

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

 

标签:  IL 类型构造器

当前标签: IL 类型构造器

 

.net里怎样在Main方法之前执行代码?   彭伟 2012-04-20 13:21 阅读:1362 评论:7   

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于.net里怎样在Main方法之前执行代码的详细内容...

  阅读:49次