Atténuation : Nouveau compilateur JIT 64 bits
À compter de .NET Framework 4.6, le runtime comprend un nouveau compilateur JIT 64 bits pour la compilation juste-à-temps. Ce changement n’affecte pas la compilation avec le compilateur JIT 32 bits.
Comportement inattendu ou exceptions
Dans certains cas, la compilation avec le nouveau compilateur JIT 64 bits entraîne une exception de runtime ou le non-respect du comportement lors de l’exécution de code compilé par l’ancien compilateur JIT 64 bits. Voici quelques-unes des différences connues :
Important
Tous ces problèmes connus ont été résolus dans le nouveau compilateur 64 bits fourni avec le SDK .NET Framework 4.6.2. La plupart ont également été résolus dans les versions de maintenance du .NET Framework 4.6 et 4.6.1, qui sont disponibles via Windows Update. Vous pouvez éviter 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 versions Release. Ce problème se manifeste notamment lorsque des éléments dans une collection apparaissent dans un ordre inattendu.
Dans certaines conditions, la comparaison de valeurs UInt16 avec le bit le plus élevé est incorrecte si l’optimisation est activée.
Sous certaines conditions, en particulier lors de l’initialisation de tableaux de valeurs, l’initialisation de la mémoire par l’instruction OpCodes.Initblk du langage intermédiaire peut initialiser la mémoire avec une valeur incorrecte. Cela peut entraîner une exception non gérée ou une sortie incorrecte.
Dans certains cas rares, un test conditionnel binaire peut retourner une valeur Boolean incorrecte ou lever une exception si les optimisations du compilateur sont activées.
Sous certaines conditions, si une instruction
if
est utilisée pour tester une condition avant d’entrer dans un bloctry
et dans la sortie du bloctry
, et que la même condition est évaluée dans le bloccatch
oufinally
, le nouveau compilateur JIT 64 bits supprime la conditionif
du bloccatch
oufinally
lorsqu’il optimise le code. Par conséquent, le code à l’intérieur de l’instructionif
dans le bloccatch
oufinally
est exécuté de manière non conditionnelle.
Atténuation des problèmes connus
Si vous rencontrez les problèmes répertoriés ci-dessus, vous pouvez les traiter en procédant d’une des façons suivantes :
Mettez à niveau vers .NET Framework 4.6.2. Le nouveau compilateur 64 bits inclus avec .NET Framework 4.6.2 résout chacun de ces problèmes connus.
Assurez-vous 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. Consultez la section Atténuation des autres problèmes pour plus d’informations sur cette procédure.
Atténuation des autres problèmes
Si vous rencontrez une autre différence de comportement entre le code compilé avec l’ancien compilateur JIT 64 bits et celui compilé avec le nouveau compilateur, ou entre les versions Debug et Release de votre application lorsque les deux sont compilées avec le nouveau compilateur JIT 64 bits, vous pouvez procéder comme suit pour compiler votre application avec l’ancien compilateur JIT 64 bits :
Pour chaque application le nécessitant, vous pouvez ajouter l’élément <useLegacyJit> au fichier de configuration de votre application. Ce qui suit désactive la compilation avec le nouveau compilateur JIT 64 bits et utilise l’ancien compilateur à la place.
<?xml version ="1.0"?> <configuration> <runtime> <useLegacyJit enabled="1" /> </runtime> </configuration>
Pour chaque utilisateur concerné, vous pouvez ajouter une valeur
REG_DWORD
nomméeuseLegacyJit
à la clé de registreHKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework
. La valeur 1 active l’ancien compilateur JIT 64 bits ; la valeur 0 le désactive et active le nouveau compilateur JIT 64 bits.Pour chaque machine concernée, vous pouvez ajouter une valeur
REG_DWORD
nomméeuseLegacyJit
à la clé de registreHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework
. La valeur 1 active l’ancien compilateur JIT 64 bits ; la valeur 0 le désactive et active le nouveau compilateur JIT 64 bits.
Vous pouvez également nous indiquer votre problème en signalant un bogue sur Microsoft Connect.