2010-07-26 48 views
2

我曾經認爲一個程序集只能有一個main()方法,直到我在哥本哈根的微軟辦公室發佈的視頻演講中看到Jon Skeet的MiscUtil。有關組件中寫入程序集入口點的信息在哪裏?

所以,我寫了這個小應用程序,有兩個主要的()方法,像這樣:

namespace ManyMains 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Hello, World!"); 
      Console.ReadKey(); 
     } 
    } 

    class YetAnotherProgram 
    { 
     static void Main() 
     { 
      Console.WriteLine("Yet another program."); 
      Console.ReadKey(); 
     } 
    } 
} 

我設置的啓動對象在Visual Studio和它的工作。好吧,沒有理由困擾。然後,我想看看這些信息存儲在程序集中的什麼位置,所以我在反射器中打開了編譯後的二進制文件,並且完全沒有看到這種效果。

我想知道是否這種信息被寫入清單或PE映像的一些COFF標題中,但無法在反彙編中看到,但可以在十六進制編輯器中看到?

回答

5

我只是打開了我的IL反彙編可執行文件之一。注意Main方法的.entrypoint行。

.method public hidebysig static void Main() cil managed 
{ 
    .entrypoint 
    .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = (01 00 00 00) 
    .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = (01 00 00 00) 
    // Code size  22 (0x16) 
    .maxstack 1 
    .locals init ([0] class AuctionSniper.Main.App app) 
    IL_0000: nop 
    ... <snipped> 

VS非入口點方法 - 比方說的InitializeComponent()

.method public hidebysig instance void InitializeComponent() cil managed 
{ 
    .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = (01 00 00 00) 
    // Code size  20 (0x14) 
    .maxstack 8 
    IL_0000: nop 
    IL_0001: ldarg.0 
    ... <snipped> 
+0

非常好。謝謝。 – 2010-07-26 17:45:50

1

您可以檢查使用ildasm.exe

ildasm /ALL /TEXT program.exe 
+0

哇!很有意思。謝謝。 :-) – 2010-07-26 17:50:15

2

在PE文件的CLI頭偏移量20,有入口點令牌。請參閱ecma 335規範的第25.3.3節。

在IL中,您應該將.entrypoint指令放入方法體中。該方法必須是靜態的,沒有參數或接受一串字符串。 (包括可變參數)。如果將語言更改爲IL,則應該在反射器中看到此內容。

+0

優秀的信息。謝謝。 :-) – 2010-07-26 17:51:23

相關問題