I normali file EXE generati da mono sono in IL.Voglio generare Native eseguibile, l'utilizzo di mkbundle produce i nativi di Exe o devo usare Mono AOT.Mono Mkbundle produce il codice nativo
risposta
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
.
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)
Per nativo intendo codice specifico della piattaforma .. non IL Code. Cosa intendo è ... otterrò un binario come quello generato da un compilatore c? – techno
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
Ha ragione, tutto quello che fa è copiare direttamente il file. file dll e .exe in un assembly, non li compila sul codice macchina – evolvedmicrobe
- 1. mkbundle su Mac con Mono: file "mono/metadata/mono-config.h" non trovato
- 2. Mono per Android, offuscamento del codice
- 3. Come convertire un semplice progetto di console .Net in un exe portatile con Mono e mkbundle?
- 4. Java produce codice oggetto o codice byte?
- 5. Distribuisci applicazione senza installare mono
- 6. Differenza tra codice nativo e codice gestito?
- 7. Compilando java nel codice nativo?
- 8. visualizza codice nativo da Eclipse
- 9. Three.js portato su codice nativo?
- 10. Access AsyncStorage dal codice nativo
- 11. Come ottenere il punto di interruzione nel codice nativo NDK e eseguire il debug del codice nativo in Android Studio?
- 12. Conversione da app .NET a codice nativo x86
- 13. Trivial frammento di codice F # non funziona sotto MONO
- 14. Bundle .net exe, dlls, .net ambiente e dll nativo in singolo exe
- 15. come eseguire il debug del codice nativo puro su Android?
- 16. Come generare ed eseguire il codice nativo in modo dinamico?
- 17. Dove puoi trovare il codice nativo nel JDK?
- 18. Perché è necessario/utilizzare il codice gestito (su nativo)?
- 19. Codice misto (nativo, gestito): come interagisce (tecnicamente)?
- 20. codice sorgente del metodo nativo Java
- 21. codice nativo per Java Math classe
- 22. perdita di memoria java con codice nativo
- 23. Posso estendere Corona con codice nativo?
- 24. Debug di codice nativo di HelloJni
- 25. Android bitmap codice nativo - che collega problema
- 26. accesso java metodo sincronizzato dal codice nativo
- 27. Limita funzionalità codice nativo da Java
- 28. Estensione per Firefox: esecuzione del codice nativo?
- 29. debug di codice nativo in Biblioteca Android
- 30. Esecuzione codice nativo da JVM/CLR
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
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
Questa opzione è disponibile nell'interfaccia utente di Visual Studio per Mac? – rraallvv