Normalne EXE generowane przez mono są w IL. Chcę wygenerować Native Executable, czy przy użyciu mkbundle generuję natywne Exe lub czy powinienem używać Mono AOT.Czy Mono-Mkbundle produkuje kod natywny
Odpowiedz
Tak, mkbundle tworzy natywne pliki wykonywalne. Na przykład na Linuksie, tu jest mój NET:
file Agent.exe
Agent.exe: PE32 executable (console) Intel 80386, Mono/.Net assembly, for MS Windows
powiem mkbundle
go skompilować do natywnego pliku wykonywalnego (tu muszę dodać Common.dll który jest zależnością do mojego zespołu agent.exe):
mkbundle --deps -o Agent Agent.exe Common.dll OS is: Linux Sources: 3 Auto-dependencies: True embedding: Agent/bin/Debug/Agent.exe embedding: Agent/bin/Debug/Common.dll embedding: /usr/lib/mono/4.5/mscorlib.dll embedding: /usr/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll embedding: /usr/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll embedding: /usr/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll embedding: /usr/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll embedding: /usr/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll embedding: /usr/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll embedding: /usr/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll embedding: /usr/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll embedding: /usr/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll embedding: /usr/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll embedding: /usr/lib/mono/gac/Mono.Data.Tds/4.0.0.0__0738eb9f132ed756/Mono.Data.Tds.dll embedding: /usr/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll embedding: /usr/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll Compiling: as -o temp.o temp.s cc -ggdb -o Agent -Wall temp.c `pkg-config --cflags --libs mono-2` temp.o Done
A teraz ponownie uruchomić komendę file
, tym razem przeciwko generowane 'przedstawiciel' binarnym:
file Agent
Agent: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=698384c13208eccc609e5a573deeb09ed3420a29, not stripped
Uwaga: ten rodzimy plik binarny nadal zależy od biblioteki libmono (biblioteki uruchomieniowej Mono), więc nie będzie działać na komputerze bez działającej instalacji Mono.
Można jednak osadzić libmono w pliku binarnym i uzyskać niezależny, samodzielny plik wykonywalny, używając opcji mkbundle --static
.
mkbundle generuje wykonywalnego programu, które zawierają kopie statyczne zespołów wymienionych w linii polecenia.
Wątpię, że to jest to, czego się spodziewałeś po słowie "native exe". Oto mały eksperyment:
Test01.cs
using System;
public class Test01 {
public static void Main()
{
Console.WriteLine("Hello, world!");
Console.WriteLine("Hello, world!");
Console.WriteLine("Hello, world!");
}
}
Wyjście MSIL powinien zawierać trzy pary ldstr
i call
instrukcjami, a kończącą ret
instrukcji. Ich rozkazy są 0x72, 0x28 i 0x2a odpowiednio:
Sprawdźmy zrzutu szesnastkowego (grep -P
pozwala nam używać non-chciwy mecz *?
)
$ od -t x1 -w9999999 Test01.exe | grep -o -P 72.*?28.*?2a
...
72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 2a
Teraz znać sekwencję bajtów MSIL odpowiadającą powyższemu Test01.cs
. I wyjście z mkbundle
zawiera dokładnie tę samą sekwencję bajtów:
$ mkbundle -o Test01 Test01.exe --deps
...
$ od -t x1 -w9999999 Test01 | fgrep -o '72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 2a'
72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 2a
Niestety nie sądzę mkbundle(1)
ma żadnych opcji, takich jak --full-aot
. Tak więc AOT i tworzenie pakietu (statycznego) exe wzajemnie się wykluczają (Mono 4.2.2.30)
Przez natywny mam na myśli kod specyficzny dla platformy .. nie IL Code.Co mam na myśli jest .. czy otrzymam binarny jak ten generowany przez kompilator c? – techno
Ponownie, nie sądzę, możesz użyć 'mkbundle' i AOT w tym samym czasie, ale możesz mieć lepsze rozwiązanie na [email protected] – nodakai
Ma rację, wszystko, co robi, to bezpośrednio skopiować. pliki dll i .exe w zespole, nie kompiluje ich do kodu maszynowego – evolvedmicrobe
Dzięki za szczegółową odpowiedź. Więc jeśli użyję mkbundle w Windows to utworzy plik exe z natywnym kodem zamiast ILCODE dobrze? W przypadku .NET i użyłem zaciemniania dla ochrony, czy powinienem go również używać? – techno
Tak, to jest punkt użycia mkbundle. Ale nie mogę ci pomóc, jak uruchomić go w systemie Windows (nie używam go), wiem tylko, że będziesz musiał zainstalować kompilator Mingw i Cygwin przed użyciem mkbundle. – mbarthelemy
Czy ta opcja jest dostępna w interfejsie użytkownika programu Visual Studio dla komputerów Mac? – rraallvv