Search code examples
windowsmonoaot

mono AOT on Windows exe gives me an DLL


I'm on Windows and I'm trying ahead of time compilation on Main.exe that's been compiled with the Mono C# compiler gmcs (also tried mcs).

>mono --aot Main.exe
Mono Ahead of Time compiler - compiling assembly C:\test\Main.exe 
Code: 21   Info: 4 Ex Info: 8 Class Info: 30 PLT: 2 GOT 
Info: 6 GOT Info Offsets: 8 GOT: 12 
Executing the native assembler: as C:\DOCUME~1\MigueldeIcaza\LOCALS~1\Temp\mono_aot_D2 ID2U -o C:\DOCUME~1\MigueldeIcaza\LOCALS~1\Temp\mono_aot_D2ID2U.o 
Executing the native linker: gcc -shared --dll -mno-cygwin -o C:\test\Main.exe.dll C:\DOCUME~1\MigueldeIcaza\LOCALS~1\Temp\mono_aot_D2ID2U.o 
Compiled 2 out of 2 methods (100%) Methods without GOT slots: 2 (100%) 
Direct calls: 0 (100%) JIT time: 0 ms, Generation time: 0 ms, 
Assembly+Link time: 319 ms. GOT slot distribution:
image: 1

but that produces a Main.exe.dll and I want an executable. Is that possible?

Update:

I intercepted the AOT/build process by write protecting Main.exe.dll and now I have a mono_aot_FZKP2U.o but still no luck:

>gcc -o Main2.exe mono_aot_FZKP2U.o
/mingw/lib/libmingw32.a(main.o):main.c:(.text+0x104): 
undefined reference to `WinMain@16'
collect2: ld returned 1 exit status`

Update 2009-10-30:

After reading Jb Evains answer I once again tried to runt the Main.exe.dll with mono with no success.

C:\test>mono Main.exe.dll
Mono-INFO: Assembly Loader probing location: 'C:\PROGRA~1\MONO-2~1.3\lib\mono\1.
0\mscorlib.dll'.
Mono-INFO: Image addref mscorlib 003E5F48 -> C:\PROGRA~1\MONO-2~1.3\lib\mono\1.0
\mscorlib.dll 00B42BC0: 2

Mono-INFO: AOT failed to load AOT module C:\PROGRA~1\MONO-2~1.3\lib\mono\1.0\msc
orlib.dll.dll: The system cannot find the file specified.


Mono-INFO: Assembly Loader loaded assembly from location: 'C:\PROGRA~1\MONO-2~1.
3\lib\mono\1.0\mscorlib.dll'.
Mono-INFO: Config attempting to parse: 'C:\PROGRA~1\MONO-2~1.3\lib\mono\1.0\msco
rlib.dll.config'.
Mono-INFO: Config attempting to parse: 'C:\PROGRA~1\MONO-2~1.3\lib\..\etc\mono\a
ssemblies\mscorlib\mscorlib.config'.
Mono-INFO: Assembly mscorlib 003E5F48 added to domain Main.exe.dll, ref_count=1

Mono-INFO: Config attempting to parse: 'C:\PROGRA~1\MONO-2~1.3\lib\..\etc\mono\c
onfig'.
Mono-INFO: Assembly Loader probing location: 'Main.exe.dll'.
Cannot open assembly 'Main.exe.dll': File does not contain a valid CIL image.
Mono-INFO: Unloading domain Main.exe.dll 00B04EA0, assembly mscorlib 003E5F48, r
efcount=1

Mono-INFO: Unloading assembly mscorlib [003E5F48].
Mono-INFO: Unloading image C:\PROGRA~1\MONO-2~1.3\lib\mono\1.0\mscorlib.dll [00B
42BC0].

Solution

  • The Mono AOT compilation process doesn't create an executable. It indeed creates a library. Mono automatically picks up the AOTed code if possible, you just have to run mono Main.exe like you would normally do. You can check by specifying the environment variable MONO_LOG_LEVEL=debug if Mono picks up the native code.