2010-07-26 18 views
2

Je pensais qu'un assemblage ne pouvait avoir qu'une seule méthode main() jusqu'à ce que je vois MiscUtil de Jon Skeet dans une conférence vidéo qu'il a donnée au bureau de Microsoft à Copenhague.Où sont les informations sur le point d'entrée d'un assemblage écrit dans l'assemblage?

Alors, je l'ai écrit cette petite application qui avait deux méthodes principales() comme ceci:

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(); 
     } 
    } 
} 

I définir l'objet StartUp dans Visual Studio et cela a fonctionné. D'accord, pas de cause de détresse. Ensuite, je voulais voir où exactement ces informations sont stockées dans l'assemblage, donc j'ai ouvert le binaire compilé dans le réflecteur et vu absolument aucune métadonnée à cet effet. Je me demande si ce genre d'information est écrit dans le manifeste ou dans un en-tête COFF de l'image PE qui ne peut pas être vu dans un désassembleur mais peut être vu dans un éditeur hexadécimal?

Répondre

5

Je viens d'ouvrir un de mes executables dans l'IL désassembleur. Notez la ligne .entrypoint pour la méthode Main.

.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 une méthode de point non-entrée - permet de dire InitializeComponent()

Dans l'en-tête du fichier CLI PE
.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

Excellent. Je vous remercie. –

1

Vous pouvez vérifier que l'utilisation ildasm.exe

ildasm /ALL /TEXT program.exe 
+0

Wow! Très intéressant. Je vous remercie. :-) –

2

à décalage 20, il y a le jeton de point d'entrée. voir la section 25.3.3 de la spécification ecma 335.

Dans IL, vous devez placer la directive .entrypoint dans un corps de méthode. La méthode doit être statique, ne pas avoir de paramètres ou accepter une série de chaînes. (Varargs inclus). vous devriez voir ceci dans le réflecteur si vous changez la langue en IL.

+0

Excellente information. Je vous remercie. :-) –