2013-12-10 11 views

Odpowiedz

14

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.

+0

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

+0

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

+0

Czy ta opcja jest dostępna w interfejsie użytkownika programu Visual Studio dla komputerów Mac? – rraallvv

3

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)

+0

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

+0

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

+0

Ma rację, wszystko, co robi, to bezpośrednio skopiować. pliki dll i .exe w zespole, nie kompiluje ich do kodu maszynowego – evolvedmicrobe