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
- 1. Demontaż Java JIT skompilowany natywny kod bajtowy
- 2. node.js TypeError: Object funkcji Object() {[natywny kod]} ma metodę 'przypisać'
- 3. Mieszany kod (natywny, zarządzany): jak to (technicznie) współdziała?
- 4. Dlaczego "////'.split('/") produkuje []?
- 5. RESTful produkuje plik binarny
- 6. Android NDK: jak wyczyścić kod natywny po ponownym uruchomieniu działania?
- 7. Jak zoptymalizować natywny kod za pomocą android-ndk (Optymalizacja prędkości)
- 8. Pakiet Node-Webkit z modułem zewnętrznym zawierającym kod natywny
- 9. Natywny kod WebRTC (C++) z niestandardowym VideoCapturer main_thread_.CalledOnValidThread() check
- 10. Jak debugować kod natywny w projekcie biblioteki Android?
- 11. Jak wywołać natywny kod C, używając rozszerzenia js-ctypes Firefox?
- 12. Błąd: SyntaxError: DOM Exception 12 setRequestHeader @ [kod natywny]
- 13. RyuJit produkuje niepoprawne wyniki
- 14. Symfony produkuje białą stronę
- 15. gprof produkuje puste wyjście
- 16. Picasso produkuje OutOfMemoryError
- 17. Drukuj: nie produkuje wyjścia
- 18. Czy widok "Hot Spot" jprofiler poprawnie uwzględnia procesor zużywany przez natywny kod wywoływany przez JNI?
- 19. Projections.countDistinct Hibernate produkuje nieoczekiwany wynik
- 20. Jak reaguje natywny działa?
- 21. Czy istnieje sposób na wyczyszczenie html, który produkuje jinja2?
- 22. Pandas TimeSeries resample produkuje NaNs
- 23. Android: takePicture() nie produkuje dźwięku
- 24. error_reporting (E_ALL) nie produkuje błąd
- 25. NumPy random seed produkuje różne liczby losowe
- 26. Android natywny ekran blokady ICS
- 27. React-natywny z Android Studio
- 28. iPhone - Czy można ukryć natywny pasek przewijania w interfejsie UIWebView?
- 29. C++ - Bit-mądry nie uchar produkuje int
- 30. grep -f na OS X produkuje segfault
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