Используйте опережающий компилятор со статическими библиотеками. A.k.a. мкбандл на моно
Mono поставляется с интерфейсом командной строки для моно JIT-компилятора для компиляции AOT (заранее). Вы можете использовать это для создания статически связанного .o, который затем можно запустить с помощью тривиальной оболочки, которая вызывает моно-кодировщик времени выполнения с объектным файлом. Если затем вы статически создадите ссылку на моно-библиотеки, у вас не будет никаких внешних зависимостей от установленной платформы .NET.
Конечно, вам придется отгрузить все статически связанные библиотеки или в конечном итоге получить огромный exe, но эй, это то, что вы просили
mono --aot=static
static Create an ELF object file (.o) which can be statically linked into an executable when embedding the mono runtime. When this option is used, the object
file needs to be registered with the embedded runtime using the mono_aot_register_module function which takes as its argument the mono_aot_module_<ASSEM‐
BLY NAME>_info global symbol from the object file:
extern void *mono_aot_module_hello_info;
mono_aot_register_module (mono_aot_module_hello_info);
Хотя я использовал это в Linux, я не совсем уверен, что он одинаково хорошо работает на Windows.
Обновление Вспомнил инструмент mkbundle :
sehe@sehelap:~$ mkbundle --static test.exe -o hello
OS is: Linux
Note that statically linking the LGPL Mono runtime has more licensing restrictions than dynamically linking.
See http://www.mono-project.com/Licensing for details on licensing.
Sources: 1 Auto-dependencies: False
embedding: /home/sehe/test.exe
Compiling:
as -o temp.o temp.s
cc -o hello -Wall `pkg-config --cflags mono` temp.c `pkg-config --libs-only-L mono` -Wl,-Bstatic -lmono -Wl,-Bdynamic `pkg-config --libs-only-l mono | sed -e "s/\-lmono //"` temp.o
Done
sehe@sehelap:~$ ./hello
hello world
sehe@sehelap:~$ ldd hello
linux-gate.so.1 => (0xb7875000)
libdl.so.2 => /lib/libdl.so.2 (0xb785f000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7845000)
libm.so.6 => /lib/libm.so.6 (0xb781e000)
libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb7819000)
librt.so.1 => /lib/librt.so.1 (0xb7810000)
libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0xb7741000)
libc.so.6 => /lib/libc.so.6 (0xb75e4000)
/lib/ld-linux.so.2 (0xb7876000)
libpcre.so.3 => /lib/libpcre.so.3 (0xb75af000)