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?
Odpowiedzi:
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
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:
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:
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.
Otwórz znak zachęty powłoki i cd
przejdź do katalogu aplikacji.
Wpisz to:
dotnet compile --native
Otóż to! Kiedy skończysz, Twoja aplikacja zostanie skompilowana do pojedynczego pliku binarnego, na przykład:
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 .
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.
Microsoft ogłosił wprowadzenie .NET Native Preview , które pozwoli na uruchamianie aplikacji .NET bez konieczności instalowania frameworka.
Spójrz: http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx
Często zadawane pytania: http://msdn.microsoft.com/en-US/vstudio/dn642499.aspx
Możesz pobrać Microsoft .NET Native dla VS2013 stąd: http://msdn.microsoft.com/en-US/vstudio/dotnetnative
Tak, używając Ngen , natywnego generatora obrazów. Jest jednak kilka rzeczy, o których musisz wiedzieć:
Podsumowując, warto używać Ngen tylko wtedy, gdy potrzebujesz skrócić czas uruchamiania aplikacji.
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.
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ć.
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.
Odpowiedź 2019: Użyj dotnet / corert . Może kompilować projekty .NET Core do samodzielnych .exe
plikó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.
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.
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).
Wygląda na wykonalne rozwiązania net core RT; wkrótce wszystkie aplikacje trafią do .net core; https://www.codeproject.com/Articles/5262251/Generate-Native-Executable-from-NET-Core-3-1-Proje?msg=5753507#xx5753507xx https://docs.microsoft.com/en-us / archive / msdn-magazine / 2018 / november / net-core-publishing-options-with-net-core
nie testowane może ze starym winem .net sdk możliwe zrobić podobnie.
spróbuj tego ( http://www.dotnetnative.online/ ), aby skompilować .net skompilowany exe do natywnego exe, próbowałem tego, jest nowy, ale dobry.