Wat*_* v2 2 c# reflection assemblies entry-point
我曾经认为一个程序集只能有一个main()方法,直到我在哥本哈根的微软办公室的视频讲座中看到Jon Skeet的MiscUtil.
所以,我写了这个有两个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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在Visual Studio中设置了StartUp对象并且它有效.好吧,没有理由感到苦恼.然后,我想看看这个信息存储在程序集中的确切位置,所以我在反射器中打开了编译后的二进制文件,并且完全看不到这种效果的元数据.
我想知道是否将这种信息写入清单或PE图像的某些COFF标题中,这些标题在反汇编程序中无法看到但可以在十六进制编辑器中看到?
我刚刚在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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)