Jak skompilować aplikację .NET do kodu natywnego?

89

Jeśli chcę uruchomić aplikację .NET na komputerze, na którym nie jest dostępna struktura .NET; Czy istnieje sposób na skompilowanie aplikacji do kodu natywnego?

Niyaz
źródło

Odpowiedzi:

45

Firma Microsoft ma artykuł opisujący, jak można skompilować MSIL do kodu natywnego

Możesz użyć Ngen .

Native Image Generator (Ngen.exe) to narzędzie poprawiające wydajność zarządzanych aplikacji. Ngen.exe tworzy obrazy natywne, czyli pliki zawierające skompilowany kod maszynowy specyficzny dla procesora, i instaluje je w pamięci podręcznej obrazów natywnych na komputerze lokalnym. Środowisko uruchomieniowe może zamiast tego używać natywnych obrazów z pamięci podręcznej przy użyciu kompilatora just-in-time (JIT) do kompilowania oryginalnego zestawu.

Niestety nadal potrzebujesz bibliotek z frameworka, aby uruchomić swój program. Nie ma żadnej funkcji, o której wiem, w zestawie SDK platformy MS .Net, która pozwala skompilować wszystkie wymagane pliki w jeden plik wykonywalny

Espo
źródło
1
Nie znajduję żadnego innego powodu, aby to wykorzystać poza występami. Kod CLR można nadal czytać jak poprzednio, ale nadal potrzebujesz platformy .NET. Tak rozczarowujący Microsoft nie dostarczył narzędzia, które rozwiązałoby to, co uważam za duży problem (każdy może zobaczyć twój kod wysokiego poziomu tak, jak jest)
MasterMastic
Nie zgadzam się z Espo. Ponieważ szary tekst mówi „Runtime”, co oznacza CLR, a tym samym .NET Framework, który pojawia się na obrazku, jak słusznie wskazał Chris. Jednak punkt NGen jest prawdziwy. Pytanie brzmi, bez użycia CLR / Runtime / .NET Framework wszystkie są takie same.
Jasmine
1
Czas się jednak ekscytować, wygląda na to, że framework .net w końcu dostanie natywny kompilator - msdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder
ILMerge plik wykonywalny .NET i wszystko w jego drzewie zależności, a następnie Ngen, jeśli chcesz, aby plik wykonywalny był niezależny od .NET .
24

RemoteSoft tworzy narzędzie, które kompiluje aplikację .NET do pakietu, który można uruchomić bez zainstalowanego .NET. Nie mam z tym żadnego doświadczenia:

RemoteSoft Salamander

Simon Steele
źródło
5
To jedyne narzędzie, o którym kiedykolwiek słyszałem, które zrobi to bez konieczności korzystania z frameworka. Oczywiście kosztuje 1249 USD.
Slapout
3
Próbowałem kilka razy w ciągu ostatnich kilku lat, aby uzyskać informacje lub ocenę, ale nigdy nie odsyłali moich e-maili z cenami ani prezentacjami, więc myślę, że ich produkt może być nieco podejrzany.
codenheim
21

Jak wspomniano w niektórych innych odpowiedziach, możesz użyć narzędzia .NET Native do skompilowania aplikacji do natywnego kodu maszynowego. Jednak w przeciwieństwie do tych odpowiedzi wyjaśnię, jak to zrobić.

Kroki:

  1. Zainstaluj narzędzie dotnet CLI (interfejs wiersza polecenia), które jest częścią nowego łańcucha narzędzi .NET Core. Użyjemy tego do skompilowania naszej aplikacji; możesz znaleźć dobry artykuł na ten temat tutaj.

  2. Otwórz znak zachęty powłoki i cdprzejdź do katalogu aplikacji.

  3. Wpisz to:

    dotnet compile --native
    

Otóż ​​to! Kiedy skończysz, Twoja aplikacja zostanie skompilowana do pojedynczego pliku binarnego, na przykład:

Natywny skompilowany .NET Core EXE

Będzie to samodzielny plik wykonywalny; nie zawiera plików PDB, zestawów ani plików konfiguracyjnych (hura!).


Alternatywnie, jeśli chcesz mieć jeszcze szybszy program, możesz uruchomić to:

dotnet compile --native --cpp

To zoptymalizuje Twój program przy użyciu generatora kodu C ++ (w przeciwieństwie do RyuJIT), dzięki czemu Twoja aplikacja będzie jeszcze bardziej zoptymalizowana pod kątem scenariuszy AOT.

Więcej informacji na ten temat można znaleźć w repozytorium GitHub interfejsu wiersza polecenia dotnet .

James Ko
źródło
Uwaga: jest to obsługiwane tylko w przypadku projektów utworzonych za pomocą platformy .NET Core. (+1)
Mahmoud Al-Qudsi
Zapomniałeś o bardzo ważnym szczególe, że .NET Native wymaga systemu Windows 10.
Elmue,
wygląda na to, że nie działa z .net core 3.1 jakieś aktualizacje?
user1005462
19

Przetestowałem kilka z nich i w tej chwili jedynym, który obsługuje .NET 3.5, a także ma świetny stos wirtualizacji, jest Xenocode Postbuild

W przypadku ngen nadal musisz mieć zainstalowaną platformę .NET, ale za pomocą narzędzia jako takiego cały kod zarządzany jest kompilowany do kodu natywnego, dzięki czemu można go wdrożyć na maszynach bez obecności struktury.

Erick Sgarbi
źródło
11

Tak, używając Ngen , natywnego generatora obrazów. Jest jednak kilka rzeczy, o których musisz wiedzieć:

  • Nadal potrzebujesz środowiska CLR, aby uruchomić plik wykonywalny.
  • Środowisko CLR nie będzie dynamicznie optymalizować zestawów na podstawie środowiska, w którym jest uruchamiane (np. 486 w porównaniu z 586 w porównaniu z 686 itp.)

Podsumowując, warto używać Ngen tylko wtedy, gdy potrzebujesz skrócić czas uruchamiania aplikacji.

Chris Zwiryk
źródło
9

Możesz! Jednak jesteś ograniczony do .NET 1.1 (bez typów ogólnych): kompilacja Mono Ahead-Of-Time (AOT)

Oznacza to jednak, że kompilacja jest naprawdę natywna, więc nie będziesz już w stanie wdrożyć jednego zestawu kodu bajtowego, będziesz potrzebować jednego na platformę.

Został pierwotnie zaprojektowany, ponieważ nie ma .NET ani Mono dla iPhone'a, więc w ten sposób stworzyli MonoTouch.

Camilo Martin
źródło
6

Możesz to zrobić za pomocą nowej technologii prekompilacji o nazwie .NET Native. Sprawdź to tutaj: http://msdn.microsoft.com/en-US/vstudio/dotnetnative

Obecnie jest dostępna tylko dla aplikacji Windows Store. Wykonuje łączenie pojedynczych komponentów. Dlatego biblioteki .NET Framework są statycznie połączone z Twoją aplikacją. Wszystko jest kompilowane do natywnych, a zestawy IL nie są już wdrażane. Aplikacje nie działają w środowisku CLR, ale w uproszczonym, zoptymalizowanym środowisku wykonawczym o nazwie Managed Runtime (Mrt.dll)

Jak wspomniano powyżej, NGEN zastosował model kompilacji mieszanej i polegał na IL i JIT w scenariuszach dynamicznych. .NET Native nie wykorzystuje JIT, ale obsługuje różne dynamiczne scenariusze. Autorzy kodu musieliby korzystać z dyrektyw środowiska wykonawczego, aby udostępniać kompilatorowi .NET Native wskazówki dotyczące dynamicznych scenariuszy, które chcą obsługiwać.

m_eric
źródło
1
+1 - Czekałem lata, aż to się stanie. Miałem nadzieję, że zauroczenie świata „maszyną wirtualną” nastąpi wcześniej, ale mimo wszystko tak się dzieje. Spodziewam się, że wkrótce zobaczymy odrodzenie natywnej kompilacji. Jak powiedziałeś, obecnie dotyczy to aplikacji Windows Store, ale to tylko kwestia czasu, zanim rynek komputerów stacjonarnych zażąda równego traktowania.
codenheim
4

Możesz użyć ngen.exe do wygenerowania obrazu natywnego, ale nadal musisz rozprowadzać oryginalny kod inny niż natywny i nadal wymaga on zainstalowania struktury na komputerze docelowym.

Co tak naprawdę nie rozwiązuje twojego problemu.

Matt Bishop
źródło
2

Odpowiedź 2019: Użyj dotnet / corert . Może kompilować projekty .NET Core do samodzielnych .exeplików. Brak zależności (z wyjątkiem bibliotek systemowych, takich jak kernel32.dll). Założę się, że właśnie tego potrzebuje OP.

Z jego strony głównej GitHub:

Kompilator CoreRT może skompilować zarządzaną aplikację .NET Core do natywnego (specyficznego dla architektury) pojedynczego pliku wykonywalnego, który jest łatwy do wdrożenia. Może również tworzyć samodzielne biblioteki dynamiczne lub statyczne, które mogą być używane przez aplikacje napisane w innych językach programowania.

brk
źródło
1

Naturą .NET jest możliwość instalowania aplikacji skompilowanych do MSIL, a następnie przez JIT lub Ngen, MSIL jest kompilowany do kodu natywnego i przechowywany lokalnie w pamięci podręcznej. Jego celem nigdy nie było generowanie prawdziwego natywnego pliku .exe, który można uruchomić niezależnie od platformy .NET.

Może jest jakiś hack, który to robi, ale dla mnie nie brzmi to bezpiecznie. Jest zbyt wiele elementów dynamicznych, które wymagają frameworka, takich jak: dynamiczne ładowanie zestawu, generowanie kodu MSIL itp.

spoulson
źródło
0

Głównym powodem skompilowania do Native jest zabezpieczenie twoich kodów, w przeciwnym razie skompilowany MSIL jest podobny do wdrożenia kodów źródłowych na komputerze klienta.

NGEN kompiluje się do natywnych, ale musi również wdrażać kody IL, w tym celu jest tylko skrócenie czasu uruchamiania, ale jest również bezużyteczny.

CoreRt jest wersją alfa i działa tylko z prostymi aplikacjami typu helloworld.

.Net Core kompiluje się do pojedynczych plików wykonywalnych, ale nie jest to również natywny plik exe, jest to tylko spakowany plik kodów IL, który rozpakuje kody do folderu tymczasowego podczas działania.

Moje proste pytanie od Microsoftu brzmi: jeśli RyuJIT może skompilować IL do natywnego w locie, to dlaczego nie możesz skompilować tego samego IL z wyprzedzeniem (AOT).

Rahim Surani
źródło
„CoreRt jest wersją alfa i działa tylko z prostymi aplikacjami typu helloworld”. To nieprawda - na Steamie są gry (np. Streets4rage.com ), które są bardziej złożone niż helloworld.
S Waye
Ale CoreRT nie może skompilować żadnych aplikacji Winform. Znalazłem inny kompilator online, który może skompilować aplikację Winform ( dotnetnative.online )
Rahim Surani
-1

spróbuj tego ( http://www.dotnetnative.online/ ), aby skompilować .net skompilowany exe do natywnego exe, próbowałem tego, jest nowy, ale dobry.

Rahim Surani
źródło
Prosimy o zamieszczenie treści linku w odpowiedzi.
Russ J
-3

Myślę, że to niemożliwe. Będziesz musiał również rozpowszechniać .NET FW. Jeśli chcesz skompilować aplikację .NET do kodu natywnego, użyj narzędzia NGen

aku
źródło