2013-12-10 11 views

risposta

14

Sì, mkbundle produce eseguibili nativi. Per esempio, su Linux, ecco la mia assembly .NET:

file Agent.exe 
Agent.exe: PE32 executable (console) Intel 80386, Mono/.Net assembly, for MS Windows 

dico mkbundle compilarlo a un eseguibile nativo (qui devo aggiungere Common.dll che è una dipendenza alla mia assemblaggio 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 

Ora, corriamo di nuovo il comando file, questa volta contro il generato 'Agent' binario:

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 

Nota: questo nativo il binario dipende ancora da libmono (la libreria di runtime di Mono), quindi non funzionerà su una macchina senza un'installazione Mono funzionante.

Puoi comunque incorporare libmono nel tuo binario e ottenere un eseguibile indipendente e autonomo usando l'opzione mkbundle --static.

+0

Grazie per la risposta dettagliata.Così se utilizzo mkbundle in Windows produrrà un file exe con codice nativo piuttosto che ILCODE destra? In caso di .net ho usato l'offuscamento per la protezione dovrei usarlo anche io? – techno

+0

Sì, questo è il punto di utilizzo di mkbundle. Ma non posso aiutarti su come eseguirlo su Windows (non lo uso), so solo che dovrai installare il compilatore Mingw e Cygwin prima di usare mkbundle. – mbarthelemy

+0

Questa opzione è disponibile nell'interfaccia utente di Visual Studio per Mac? – rraallvv

3

mkbundle genera un programma eseguibile che conterrà copie statiche dei gruppi elencati nella linea di comando.

Dubito che questo è quello che ti aspettavi da una parola "nativo exe". Ecco un piccolo esperimento:

Test01.cs

using System; 
public class Test01 { 
    public static void Main() 
    { 
    Console.WriteLine("Hello, world!"); 
    Console.WriteLine("Hello, world!"); 
    Console.WriteLine("Hello, world!"); 
    } 
} 

L'output MSIL deve contenere tre paia di ldstr e call istruzioni e la terminazione ret istruzioni. I loro codici operativi sono 0x72, 0x28 e 0x2a rispettivamente:

Controlliamo il dump esadecimale (grep -P ci permette di utilizzare non avido partita *?)

$ 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 

Ora noi conoscere la sequenza di byte MSIL corrispondente al precedente Test01.cs. E l'uscita dal mkbundle contiene esattamente la stessa sequenza di byte:

$ 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 

Purtroppo non credo mkbundle(1) ha tutte le opzioni come --full-aot. Quindi, AOT e la creazione di un bundle (statico) si escludono a partire da ora (Mono 4.2.2.30)

+0

Per nativo intendo codice specifico della piattaforma .. non IL Code. Cosa intendo è ... otterrò un binario come quello generato da un compilatore c? – techno

+0

Ancora una volta, non penso che tu possa usare 'mkbundle' e AOT allo stesso tempo, ma potresti avere una soluzione migliore su [email protected] – nodakai

+0

Ha ragione, tutto quello che fa è copiare direttamente il file. file dll e .exe in un assembly, non li compila sul codice macchina – evolvedmicrobe

Problemi correlati