Si je veux exécuter une application .NET sur une machine où le framework .NET n'est pas disponible; Existe-t-il un moyen de compiler l'application en code natif?
Réponses:
Microsoft a un article décrivant comment vous pouvez compiler MSIL en code natif
Vous pouvez utiliser Ngen .
Le générateur d'images natives (Ngen.exe) est un outil qui améliore les performances des applications gérées. Ngen.exe crée des images natives, qui sont des fichiers contenant du code machine compilé spécifique au processeur, et les installe dans le cache d'images natives sur l'ordinateur local. Le runtime peut utiliser des images natives du cache à la place en utilisant le compilateur juste-à-temps (JIT) pour compiler l'assembly d'origine.
Malheureusement, vous avez toujours besoin des bibliothèques du framework pour exécuter votre programme. Il n'y a aucune fonctionnalité que je connaisse avec le SDK du framework MS .Net qui vous permet de compiler tous les fichiers requis dans un seul exécutable
RemoteSoft crée un outil qui compile une application .NET dans un package qui peut être exécuté sans .NET installé. Je n'ai aucune expérience avec ça:
Comme certaines des autres réponses ici l'ont mentionné, vous pouvez utiliser l' outil .NET Native pour compiler votre application en code machine natif. Contrairement à ces réponses, cependant, je vais expliquer comment le faire.
Pas:
Installez l' outil dotnet CLI (interface de ligne de commande), qui fait partie de la nouvelle chaîne d'outils .NET Core. Nous allons l'utiliser pour compiler notre application; vous pouvez trouver un bon article à ce sujet ici.
Ouvrez une invite du shell et cd
dans le répertoire de votre application.
Tapez ceci:
dotnet compile --native
C'est tout! Lorsque vous avez terminé, votre application sera compilée en un seul binaire, comme ceci:
Ce sera un exécutable autonome; pas de PDB, d'assemblages ou de fichiers de configuration inclus (hourra!).
Alternativement, si vous voulez un programme encore plus rapide, vous pouvez exécuter ceci:
dotnet compile --native --cpp
Cela optimisera votre programme à l'aide du générateur de code C ++ (par opposition à RyuJIT), de sorte que votre application est encore plus optimisée pour les scénarios AOT.
Vous pouvez trouver plus d'informations à ce sujet dans le repo dotnet CLI GitHub .
J'ai testé plusieurs d'entre eux et pour le moment, le seul qui prend en charge .NET 3.5 et possède également une excellente pile de virtualisation est Xenocode Postbuild
Avec ngen, vous devez toujours installer le framework .NET, mais en utilisant un outil en tant que tel, tout votre code géré est compilé en code natif afin que vous puissiez le déployer sur des machines sans la présence du framework.
Microsoft a annoncé son .NET Native Preview qui permettra d'exécuter des applications .NET sans avoir le framework installé.
Jetez un œil: http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx
FAQ: http://msdn.microsoft.com/en-US/vstudio/dn642499.aspx
Vous pouvez télécharger Microsoft .NET Native pour VS2013 à partir d'ici: http://msdn.microsoft.com/en-US/vstudio/dotnetnative
Oui, en utilisant Ngen , le générateur d'images natives. Il y a cependant un certain nombre de choses dont vous devez être conscient:
Dans l'ensemble, cela ne vaut la peine d'utiliser Ngen que si vous devez réduire le temps de démarrage de votre application.
Vous pouvez! Cependant, vous êtes limité à .NET 1.1 (pas de génériques pour vous): compilation Mono Ahead-Of-Time (AOT)
Cependant, cela signifie que la compilation est vraiment native, vous ne pourrez donc plus déployer un seul assemblage de bytecode, vous en aurez besoin d'un par plate-forme.
Il a été conçu à l'origine parce qu'il n'y a pas de .NET ou de Mono pour iPhone, c'est ainsi qu'ils ont créé MonoTouch.
Vous pouvez le faire à l'aide de la nouvelle technologie de précompilation appelée .NET Native. Découvrez-le ici: http://msdn.microsoft.com/en-US/vstudio/dotnetnative
Actuellement, il n'est disponible que pour les applications Windows Store. Il effectue la liaison d'un seul composant. Les bibliothèques .NET Framework sont donc liées statiquement à votre application. Tout est compilé en assemblages natifs et IL ne sont plus déployés. Les applications ne s'exécutent pas sur CLR mais sur un runtime optimisé et dépouillé appelé Managed Runtime (Mrt.dll)
Comme indiqué ci-dessus, NGEN a utilisé un modèle de compilation mixte et s'est appuyé sur IL et JIT pour les scénarios dynamiques. .NET Native n'utilise pas JIT, mais il prend en charge divers scénarios dynamiques. Les auteurs de code doivent utiliser les directives d'exécution pour fournir des conseils au compilateur natif .NET sur les scénarios dynamiques qu'ils souhaitent prendre en charge.
Vous pouvez utiliser ngen.exe pour générer une image native, mais vous devez toujours distribuer le code non natif d'origine également, et il a toujours besoin du framework installé sur la machine cible.
Ce qui ne résout pas vraiment votre problème.
Réponse de 2019: utilisez dotnet / corert . Il peut compiler des projets .NET Core dans des .exe
fichiers autonomes . Pas de dépendances (sauf pour les bibliothèques système comme kernel32.dll
). Je parie que c'est exactement ce dont l'OP a besoin.
Depuis sa page d'accueil GitHub:
Le compilateur CoreRT peut compiler une application .NET Core gérée dans un exécutable de fichier unique natif (spécifique à l'architecture) qui est facile à déployer. Il peut également produire des bibliothèques dynamiques ou statiques autonomes qui peuvent être utilisées par des applications écrites dans d'autres langages de programmation.
La nature de .NET est de pouvoir installer des applications qui ont été compilées sur MSIL, puis soit par JIT ou Ngen, MSIL est compilé en code natif et stocké localement dans un cache. Il n'a jamais été prévu de générer un véritable .exe natif qui puisse être exécuté indépendamment du framework .NET.
Peut-être qu'il y a un hack qui fait cela, mais cela ne me semble pas sûr. Il y a trop de dynamiques qui nécessitent le framework, telles que: chargement d'assemblage dynamique, génération de code MSIL, etc.
La principale raison de compiler en Native est de sécuriser vos codes, sinon le MSIL compilé revient à déployer les codes sources dans la machine du client.
NGEN compile en natif mais doit également déployer des codes IL, cet objectif est juste de réduire le temps de démarrage mais c'est aussi inutile.
CoreRt est une version alpha et ne fonctionne qu'avec des applications de type helloworld simples.
.Net Core se compile en fichiers exécutables uniques mais ce n'est pas non plus un exe natif, il s'agit simplement d'un fichier compressé de codes IL et il décompressera les codes dans le dossier temporaire lors de l'exécution.
Ma question simple de Microsoft est la suivante: si RyuJIT peut compiler IL en natif à la volée, alors pourquoi pas vous pouvez compiler le même IL à l'avance (AOT).
essayez ceci ( http://www.dotnetnative.online/ ) pour compiler l'exe compilé .net en exe natif, j'ai essayé ceci, c'est nouveau mais bon.