Se in C# questo snippet:
using System;
using System.Reflection;
class Foo
{
static void Main()
{
Console.WriteLine(Assembly.GetEntryAssembly().EntryPoint.Name);
}
}
stampa Main a console, non la stessa cosa si può dire dell'equivalente C++:
using namespace System;
using namespace System::Reflection;
void main()
{
Console::WriteLine(Assembly::GetEntryAssembly()->EntryPoint->Name);
}
che stampa a console:
- main
- mainCRTStartup oppure
- _mainCRTStartup
in base alle opzioni:
- /clr:safe
- /clr:pure rispettivamente
- /clr:oldSyntax (oppure /clr:initialAppDomain)
dove mainCRTStartup e _mainCRTStartup sono funzioni di C/C++ run-time startup. Il compilatore (tranne nel caso /clr:safe) chiama prima queste funzioni per le inizializzazioni necessarie alla C/C++ run-time library (variabili globali, heap, etc) e quindi saranno loro quelle decorate con .entrypoint in IL e non il metodo main dello snippet. L'opzione /clr:safe invece, produce codice verificabile e non offre supporto CRT e quindi niente stub.