Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
À compter de .NET Framework 4.6, le runtime inclut un nouveau compilateur JIT 64 bits pour la compilation juste-à-temps. Cette modification n’affecte pas la compilation avec le compilateur JIT 32 bits.
Comportement ou exceptions inattendus
Dans certains cas, la compilation avec le nouveau compilateur JIT 64 bits entraîne une exception d’exécution ou un comportement qui n’est pas observé lors de l’exécution du code compilé par le compilateur JIT 64 bits plus ancien. Les différences connues sont les suivantes :
Importante
Tous ces problèmes connus ont été résolus dans le nouveau compilateur 64 bits publié avec .NET Framework 4.6.2. La plupart ont également été traités dans les versions de service du .NET Framework 4.6 et 4.6.1 inclus dans Windows Update. Vous pouvez éliminer ces problèmes en vous assurant que votre version de Windows est à jour ou en mettant à niveau vers .NET Framework 4.6.2.
Dans certaines conditions, une opération d’unboxing peut lever une NullReferenceException dans les versions Release avec l’optimisation activée.
Dans certains cas, l’exécution du code de production dans un corps de méthode volumineux peut lever une StackOverflowException.
Dans certaines conditions, les structures passées à une méthode sont traitées comme des types référence plutôt que des types valeur dans les builds Release. L’une des manifestations de ce problème est que les éléments individuels d’une collection apparaissent dans un ordre inattendu.
Dans certaines conditions, la comparaison des UInt16 valeurs avec leur jeu de bits élevé est incorrecte si l’optimisation est activée.
Dans certaines conditions, en particulier lors de l’initialisation des valeurs de tableau, l’initialisation de la mémoire par l’instruction OpCodes.Initblk IL peut initialiser la mémoire avec une valeur incorrecte. Cela peut entraîner une exception non gérée ou une sortie incorrecte.
Dans certaines conditions rares, un test de bits conditionnel peut retourner la valeur incorrecte Boolean ou lever une exception si les optimisations du compilateur sont activées.
Dans certaines conditions, si une
if
instruction est utilisée pour tester une condition avant d’entrer dans untry
bloc et à la sortie dutry
bloc, et que la même condition est évaluée dans le bloccatch
oufinally
, le nouveau compilateur JIT 64 bits, supprime la condition du blocif
oucatch
lorsqu’il optimise lefinally
code. De ce fait, le code à l’intérieur de l’instructionif
dans le bloccatch
oufinally
est exécuté inconditionnellement.
Atténuation des problèmes connus
Si vous rencontrez les problèmes répertoriés ci-dessus, vous pouvez les résoudre en procédant comme suit :
Effectuez une mise à niveau vers .NET Framework 4.6.2. Le nouveau compilateur 64 bits inclus dans .NET Framework 4.6.2 résout chacun de ces problèmes connus.
Vérifiez que votre version de Windows est à jour en exécutant Windows Update. Les mises à jour de service pour .NET Framework 4.6 et 4.6.1 corrigent chacun de ces problèmes, à l’exception de NullReferenceException dans une opération d’unboxing.
Compilez avec l’ancien compilateur JIT 64 bits. Pour plus d’informations sur la procédure à suivre, consultez la section Atténuation des autres problèmes .
Atténuation des autres problèmes
Si vous rencontrez une autre différence de comportement entre le code compilé avec l’ancien compilateur 64 bits et le nouveau compilateur JIT 64 bits, ou entre les versions de débogage et de mise en production de votre application compilées avec le nouveau compilateur JIT 64 bits, vous pouvez effectuer les opérations suivantes pour compiler votre application avec l’ancien compilateur JIT 64 bits :
Par application, vous pouvez ajouter l’élément <useLegacyJit> au fichier de configuration de votre application. L’exemple suivant désactive la compilation avec le nouveau compilateur JIT 64 bits et utilise plutôt le compilateur JIT 64 bits hérité.
<?xml version ="1.0"?> <configuration> <runtime> <useLegacyJit enabled="1" /> </runtime> </configuration>
Par utilisateur, vous pouvez ajouter une
REG_DWORD
valeur nomméeuseLegacyJit
à laHKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework
clé du Registre. La valeur 1 active le compilateur JIT 64 bits hérité ; la valeur 0 la désactive et active le nouveau compilateur JIT 64 bits.Sur une base par ordinateur, vous pouvez ajouter une
REG_DWORD
valeur nomméeuseLegacyJit
à laHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework
clé du Registre. La valeur 1 active le compilateur JIT 64 bits hérité ; la valeur 0 la désactive et active le nouveau compilateur JIT 64 bits.
Vous pouvez également nous informer du problème en signalant un bogue sur Microsoft Connect.