Partager via


Exceptions d’exécution dans les applications natives .NET

Il est important de tester les builds de version de votre application de plateforme Windows universelle sur leurs plateformes cibles, car les configurations de débogage et de mise en production sont complètement différentes. Par défaut, la configuration de débogage utilise le runtime .NET Core pour compiler votre application, mais la configuration de mise en production utilise .NET Native pour compiler votre application en code natif.

Important

Pour plus d’informations sur le traitement des MissingMetadataException, MissingInteropDataExceptionet MissingRuntimeArtifactException exceptions que vous pouvez rencontrer lors du test des versions de publication de votre application, consultez « Étape 4 : Résoudre manuellement les métadonnées manquantes : dans la rubrique de prise en main , ainsi que Réflexion et .NET Native et directives runtime (rd.xml) ) Informations de référence sur le fichier de configuration.

Déboguer et publier des builds

Lorsque la build de débogage s’exécute sur le runtime .NET Core, elle n’a pas été compilée en code natif. Cela rend tous les services généralement fournis par le runtime disponible pour votre application.

En revanche, la build de mise en production compile en code natif pour ses plateformes cibles, supprime la plupart des dépendances sur les runtimes et bibliothèques externes, et optimise fortement le code pour des performances maximales.

Lorsque vous déboguez des builds de mise en production compilées à l’aide de .NET Native :

  • Vous utilisez le moteur de débogage .NET Native, différent des outils de débogage .NET normaux.

  • La taille de votre exécutable est réduite autant que possible. L’une des façons dont .NET Native réduit la taille d’un exécutable consiste à découper considérablement les messages d’exception d’exécution, une rubrique décrite plus en détail dans la section Messages d’exception runtime .

  • Votre code est fortement optimisé. Cela signifie que l’inlining est utilisé dans la mesure du possible. (Inlining déplace le code de routines externes vers la routine appelante.) Le fait que .NET Native fournisse un environnement d'exécution spécialisé et implémente un inlining agressif affecte la pile d'appels qui s'affiche lors du débogage. Pour plus d’informations, consultez la section pile d’appels d’exécution.

Remarque

Vous pouvez contrôler si les builds de débogage et de mise en production sont compilées avec la chaîne d’outils .NET Native en cochant ou en décochant la case à cocher Compile with .NET Native tool chain. Toutefois, le Microsoft Store compile toujours la version de production de votre application avec la chaîne d’outils .NET Native.

Messages d'exception à l'exécution

Pour réduire la taille de l’exécutable de l’application, .NET Native n’inclut pas le texte intégral des messages d’exception. Par conséquent, les exceptions d'exécution levées dans les versions de production peuvent ne pas afficher le texte intégral des messages d'exception. Au lieu de cela, le texte peut se composer d’une sous-chaîne avec un lien à suivre pour plus d’informations. Par exemple, les informations d’exception peuvent apparaître comme suit :

Exception thrown: '$16_System.AggregateException' in Unknown Module.

Additional information: AggregateException_ctor_DefaultMessage

If there is a handler for this exception, the program may be safely continued.

Si vous avez besoin du message d’exception complet, exécutez plutôt la version de débogage. Par exemple, les informations d’exception précédentes de la version de production peuvent s'afficher comme suit dans la version de débogage :

Exception thrown: 'System.AggregateException' in NativeApp.exe.

Additional information: Value does not fall within the expected range.

Pile des appels d’exécution

En raison de l’incorporation et d’autres optimisations, la pile des appels affichée par une application compilée par la chaîne d’outils .NET Native peut ne pas vous aider à identifier clairement le chemin d’accès à une exception d’exécution.

Pour obtenir la pile complète, exécutez plutôt la build de débogage.

Voir aussi