Comment compiler une application .NET en code natif?

88

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?

Niyaz
la source

Réponses:

45

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

Espo
la source
1
Je ne trouve aucune autre raison d'utiliser cela à part les performances. Le code CLR peut toujours être lu comme avant et vous avez toujours besoin de .NET. Si décevant, Microsoft n'a pas fourni un outil qui résoudrait ce que je considère être un gros problème (tout le monde peut voir votre code de haut niveau tel quel)
MasterMastic
Je ne suis pas d'accord avec Espo. Parce que, le texte en gris dit le "Runtime" qui signifie le CLR et donc le .NET Framework qui entre en image comme l'a souligné à juste titre Chris. Cependant, le point NGen est vrai. La question est, sans utiliser CLR / Runtime / .NET Framework, tous sont identiques.
Apprenant le
1
Il est temps de s'exciter cependant, on dirait que le framework .net obtient enfin un compilateur natif - msdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder
ILMerge votre exécutable .NET et tout dans son arborescence de dépendances puis Ngen si vous voulez un exécutable indépendant de .NET .
24

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:

RemoteSoft Salamander

Simon Steele
la source
5
C'est le seul outil dont j'ai jamais entendu parler qui le fera sans avoir besoin du cadre. Bien sûr, cela coûte 1249 $.
Slapout
3
J'ai essayé plusieurs fois au cours des dernières années pour obtenir des informations ou une évaluation, mais ils ne renvoient jamais mes e-mails sur les prix ou les démos, donc je pense que leur produit peut être un peu suspect.
codenheim
21

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:

  1. 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.

  2. Ouvrez une invite du shell et cddans le répertoire de votre application.

  3. Tapez ceci:

    dotnet compile --native

C'est tout! Lorsque vous avez terminé, votre application sera compilée en un seul binaire, comme ceci:

EXE .NET Core compilé nativement

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 .

James Ko
la source
Remarque: cela n'est pris en charge que pour les projets créés avec .NET Core. (+1, cependant)
Mahmoud Al-Qudsi
Vous avez oublié le détail très important que .NET Native nécessite Windows 10.
Elmue
19

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.

Erick Sgarbi
la source
11

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:

  • Vous avez toujours besoin du CLR pour exécuter votre exécutable.
  • Le CLR n'optimisera pas dynamiquement vos assemblages en fonction de l'environnement dans lequel il est exécuté (par exemple 486 vs 586 vs 686, etc.)

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.

Chris Zwiryk
la source
9

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.

Camilo Martin
la source
6

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.

m_eric
la source
1
+1 - J'attends depuis des années que cela se produise. J'espérais que l'engouement du monde pour la «machine virtuelle» ferait son cours plus tôt, mais néanmoins, cela se produit. Je pense que nous sommes sur le point de voir une résurgence de la compilation native. Comme vous l'avez dit, c'est pour Windows Store Apps pour le moment, mais ce n'est qu'une question de temps avant que le marché des ordinateurs de bureau exige un traitement égal.
codenheim
4

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.

Matt Bishop
la source
2

Réponse de 2019: utilisez dotnet / corert . Il peut compiler des projets .NET Core dans des .exefichiers 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.

brk
la source
1

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.

Spoulson
la source
0

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).

Rahim Surani
la source
"CoreRt est une version alpha et ne fonctionne qu'avec des applications simples de type helloworld." Ce n'est pas vrai - il existe des jeux sur Steam (par exemple street4rage.com ) qui sont plus complexes que helloworld.
S Waye le
Mais CoreRT ne peut compiler aucune application Winform. J'ai trouvé un autre compilateur en ligne qui peut compiler l'application Winform ( dotnetnative.online )
Rahim Surani le
-1

essayez ceci ( http://www.dotnetnative.online/ ) pour compiler l'exe compilé .net en exe natif, j'ai essayé ceci, c'est nouveau mais bon.

Rahim Surani
la source
Veuillez publier le contenu du lien dans la réponse.
Russ J le
-3

Je pense que ce n'est pas possible. Vous devrez également distribuer .NET FW. Si vous souhaitez compiler l'application .NET en code natif, utilisez l' outil NGen

aku
la source