.net里怎样在Main方法之前执行代码
2012-04-20 21:28
423 查看
.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相关文章推荐
- .net里怎样在Main方法之前执行代码?
- java语言基础|如何在main方法前执行其他代码
- 怎样在main()函数退出之后再执行一段代码?
- 怎样让一段代码在主函数之前执行
- main之前会执行什么代码
- 防止.net代码二次执行方法2则(VB.net)
- 打印Java main方法执行的命令参数代码
- 那些年犯过的错:在main方法之前,到底执行了什么?
- 1.4 如何在main()方法之前执行输出“hello world”
- main主函数执行完之后再执行其他代码的方法
- 一个方法连续调用多次,但方法体里面的代码只保证最后一次的执行,之前连续调用的方法体都不执行
- oracle中创建java包.执行JAVA代码的方法
- C# 里怎样得到当前执行的函数名,当前代码行,源代码文件名
- 在一个方法调用之前保证另一个方法已经执行
- Xcode执行项目整理——main方法简单笔记
- C#执行Javascript代码的几种方法总结
- JVM——main()方法的执行。
- 任何回调方法都无法正常执行,感觉自己已不会写代码了
- .Net中获取程序执行时间的方法
- 后台代码里执行弹出脚本方法!(Response.Write), Response.Write()彈窗的方法大全