Где информация о точке входа в сборку написана в сборке? - PullRequest
2 голосов
/ 26 июля 2010

Раньше я думал, что сборка может иметь только один метод main (), пока не увидел MiscUtil Джона Скита в видео лекции, которую он прочитал в офисе Microsoft в Копенгагене.

Итак, я написал это маленькое приложение, в котором было два метода 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, и он работал. Хорошо, нет причин для беспокойства. Затем я хотел посмотреть, где именно эта информация хранится в сборке, поэтому я открыл скомпилированный двоичный файл в рефлекторе и не увидел абсолютно никаких метаданных на этот счет.

Мне интересно, записана ли такая информация в манифест или какой-либо COFF-заголовок PE-образа, который нельзя увидеть в дизассемблере, но можно увидеть в шестнадцатеричном редакторе?

Ответы [ 3 ]

6 голосов
/ 26 июля 2010

Я только что открыл один из моих исполняемых файлов в дизассемблере IL. Обратите внимание на строку .entrypoint для метода 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>

по сравнению с методом без точки входа - скажем 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>
2 голосов
/ 26 июля 2010

В заголовке CLI PE-файла со смещением 20 есть маркер точки входа. см. раздел 25.3.3 спецификации ecma 335.

В IL вы бы поместили директиву .entrypoint в тело метода. Метод должен быть статическим, не иметь параметров или принимать множество строк. (Варарги включены). Вы должны увидеть это в отражателе, если вы измените язык на IL.

1 голос
/ 26 июля 2010

Вы можете проверить это, используя ildasm.exe

ildasm /ALL /TEXT program.exe
...