3

コペンハーゲンのMicrosoftOfficeで彼が行ったビデオ講義でJonSkeetのMiscUtilを見るまで、アセンブリにはmain()メソッドが1つしかないと思っていました。

だから、私は次のような2つのmain()メソッドを持つこの小さなアプリを書きました:

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でStartUpオブジェクトを設定しましたが、機能しました。さて、苦痛の原因はありません。次に、この情報がアセンブリのどこに正確に格納されているかを確認したかったので、コンパイルされたバイナリをリフレクターで開いたところ、その効果のメタデータはまったく表示されませんでした。

そのような情報が、逆アセンブラでは表示できないが16進エディタでは表示できるPEイメージのマニフェストまたはCOFFヘッダーに書き込まれるのではないかと思います。

4

3 に答える 3

6

IL逆アセンブラで実行可能ファイルの1つを開いたところです。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>
于 2010-07-26T17:40:49.370 に答える
2

あなたはそれを使用して確認することができますildasm.exe

ildasm /ALL /TEXT program.exe
于 2010-07-26T17:40:27.223 に答える
2

オフセット20のPEファイルのCLIヘッダーには、エントリポイントトークンがあります。ecma335仕様のセクション25.3.3を参照してください。

ILでは、.entrypointディレクティブをメソッド本体に配置します。メソッドは静的であるか、パラメーターを持たないか、文字列の配列を受け入れる必要があります。(varargsが含まれています)。言語をILに変更すると、これがリフレクターに表示されます。

于 2010-07-26T17:49:51.117 に答える