Le concept de MSIL gardé dans un fichier PE de format PE me confond. Et pourquoi devrions-nous utiliser ILASM.exe pour générer un fichier PE et NGEN.EXE pour générer un code natif, quand nous avons un compilateur JIT qui peut faire les deux par lui-même?Quelle est la principale différence entre un PE et MSIL? Pourquoi utilisons-nous explicitement ILASM, NGEN.EXE quand nous avons le compilateur JIT par défaut?
Répondre
Le format de fichier PE est utilisé sur Windows pour stocker le code exécutable, les fichiers DLL et EXE. C'est un format très flexible, il peut contenir beaucoup plus de choses que du code. Une fonctionnalité que .NET exploite, un assembly .NET est un fichier PE avec seulement 5 octets de code. Le reste est toutes les données. Vous pouvez le comparer à un fichier Java .jar. Ces données sont un en-tête qui identifie la version d'exécution requise. Un morceau de métadonnées qui décrit les types dans l'assemblage. Et un morceau de MSIL, le code intermédiaire qui sera juste-à-temps compilé au code machine à l'exécution.
Vous n'avez pas besoin de ilasm.exe pour générer un tel fichier. Tout compilateur .NET sait comment en créer un. Sous le capot, ils utilisent tous la même api de bas niveau pour écrire un assemblage. Ngen.exe est optionnel, il peut aider à améliorer le démarrage à chaud d'un programme et contourner le besoin de juste-à-temps de compiler le code MSIL en code machine. Au lieu de le faire à l'exécution, Ngen le fait à l'avance. Le code machine généré est stocké dans un fichier dans c: \ windows \ assembly. Le CLR le trouvera là-bas lorsque vous exécuterez le programme et passera l'étape de jitting, en utilisant le code machine dans le fichier à la place. L'assembly d'origine est toujours requis pour les métadonnées.
Le point clé est que ngen.exe est facultatif. C'est pas toujours préférable de compiler à l'avance, il fait en fait le démarrage à froid d'un programme plus lent car il nécessite le CLR pour trouver un fichier supplémentaire. Les temps de démarrage à froid sont dominés par le disque, ils sont lents.
- 1. Quelle est la différence entre .pdb, .pe, .dll et assembly?
- 2. Pourquoi avons-nous besoin d'un constructeur défini par le compilateur?
- 3. Pourquoi avons-nous besoin d'appeler explicitement le constructeur parent dans MSIL?
- 4. Quand avons-nous besoin d'un constructeur par défaut?
- 5. Quelle est la différence entre CIL et MSIL (IL)?
- 6. Quelle est la différence entre l'affichage par défaut et UIView?
- 7. Quand avons-nous besoin d'instancier explicitement une fonction template?
- 8. Pourquoi avons-nous encore besoin d'un fichier stub .lib quand nous avons l'implémentation réelle .dll?
- 9. Quelle est la principale différence entre Docker et Kubernetes
- 10. Quelle est la principale différence entre TableAdapter et SqlDataAdapter
- 11. Quelle est la principale différence entre android.animation et android.transition package?
- 12. Quelle est la principale différence entre ContainerControlledLifetimeManager et HierarchicalLifetimeManager?
- 13. pourquoi utiliser Sockets quand nous avons UrlConnection
- 14. Quelle est la différence entre spring-jdbc.jar et org.springframework.jdbc jar? Pourquoi avons-nous besoin des deux pots dans le projet?
- 15. Quelle est la principale différence entre la fonction require() et define() dans dojo et quand utiliserions-nous l'une ou l'autre?
- 16. Quelle est la différence entre le constructeur par défaut et par défaut
- 17. Pourquoi avons-nous besoin d'un constructeur par défaut pour passer un objet par référence en C++?
- 18. Quelle est la principale différence entre MDM et ESB?
- 19. Quelle est la principale différence entre Admob et AdSense?
- 20. Quelle est la principale différence entre AsyncTask() et Handler()?
- 21. Pourquoi avons-nous besoin de pilotes quand nous avons un noyau?
- 22. Quand est-ce qu'un app.config est créé, quand un app.exe.config et quelle est la différence
- 23. Avons-nous besoin de faire explicitement session.begin()?
- 24. Quelle est la principale différence entre docker et rkt?
- 25. Quelle est la principale différence entre Dictionary et Hashtable
- 26. Quelle est la principale différence entre $ .ajax et $ .post?
- 27. Quelle est la principale différence entre kmalloc et vmalloc?
- 28. Pourquoi avons-nous besoin d'un historyId quand nous pouvons juste vérifier si nous avons traité le tuple (userId, messageId)?
- 29. Dans iTerm2, quelle est la différence entre le "profil par défaut" et le "profil actuel"?
- 30. pourquoi nous avons externalisable quand nous pouvons substituer writeObject et readObject dans java