CORRECTIF : Sur un ordinateur qui exécute Microsoft.NET Framework 3.5 Service Pack 1, le compilateur JIT et le Générateur d’images natives (Ngen.exe) qui utilisent le fichier Mscorjit.dll peuvent générer du code incorrect

Symptômes

Sur un ordinateur qui exécute le Microsoft.NET Framework 3.5 Service Pack 1 (SP1), compilateur juste-à-temps (JIT) et la Native Image Generator (Ngen.exe) qui utilisent le fichier Mscorjit.dll peuvent générer du code incorrect. Par conséquent, une application C++ managée de 32 bits peut produire des résultats incorrects.

Ce problème se produit si les conditions suivantes sont remplies :
  • La structure ou la classe dans le code source a moins de quatre types scalaires et aucune référence d’objet managé.
  • Vous utilisez l’instruction Cpblk ou l’instruction Initblk.
Remarque Ce problème ne se produit pas dans une application 64 bits.

Cause

Ce problème est dû à une régression dans le.NET Framework 3.5 SP1.

Résolution

Informations sur le correctif

Un correctif pris en charge est disponible auprès de Microsoft. Toutefois, ce correctif vise à corriger uniquement le problème décrit dans cet article. Appliquez ce correctif uniquement aux systèmes rencontrant ce problème spécifique. Ce correctif va peut-être subir des tests supplémentaires. Par conséquent, si vous n'êtes pas sérieusement concerné par ce problème, nous vous recommandons d'attendre la prochaine mise à jour logicielle qui contiendra ce correctif.

Pour télécharger ce correctif depuis MSDN Code Gallery, visitez le site Web de Microsoft à l’adresse suivante :


Remarque MSDN Code Gallery affiche les langues pour lesquelles ce correctif est disponible. Si vous ne voyez pas votre langue, c'est certainement dû au fait que la page de ressource Code Gallery n'existe pas dans cette langue.


Remarque Si des problèmes supplémentaires se produisent ou si des procédures de dépannage sont nécessaires, vous devrez peut-être formuler une demande de service distincte. Les coûts habituels du support technique s'appliqueront aux questions et problèmes qui ne relèvent pas de ce correctif logiciel. Pour une liste complète des numéros de téléphone du Service clientèle et support technique de Microsoft ou pour créer une demande de service distincte, visitez le site Web de Microsoft à l'adresse suivante :

Remarque Si vous avez une application 32 bits qui s’exécute sur une plate-forme 64 bits, appliquez le correctif pour la version 64 bits résoudre ce problème.

Conditions préalables

Vous devez avoir le.NET Framework 3.5 Service Pack 1 pour appliquer ce correctif.

Nécessite un redémarrage

Vous devrez peut-être redémarrer l’ordinateur si les fichiers qui sont mis à jour sont utilisées.

Informations de remplacement du correctif

Ce correctif ne remplace aucun autre correctif.

Informations sur les fichiers

La version anglaise de ce correctif dispose des attributs de fichier (ou version ultérieure) répertoriés dans le tableau suivant. Les dates et heures de ces fichiers sont répertoriées en temps universel coordonné (UTC). Lorsque vous affichez les informations de fichier, elles sont converties en heure locale. Pour trouver la différence entre l’UTC et l’heure locale, utilisez l’onglet fuseau horaire dans l’élément de Date et heure dans le panneau de configuration.
Windows 2000, Windows XP et Windows Server 2003, x86 les versions
Nom de fichierVersion de fichierTaille du fichierDateHeure
Mscordacwks.dll2.0.50727.3068992,26416-Sep-200813:13
Mscorjit.dll2.0.50727.3068367,10416-Sep-200813:13
Mscorlib.dll2.0.50727.30684,546,56016-Sep-200813:13
Mscorwks.dll2.0.50727.30685,815,80816-Sep-200813:13
Windows 2000, Windows XP et Windows Server 2003, x64 les versions
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
Mscordacwks.dll2.0.50727.3068992,26416-Sep-200813:13x86
Mscorjit.dll2.0.50727.3068367,10416-Sep-200813:13x86
Mscorlib.dll2.0.50727.30684,546,56016-Sep-200813:13x86
Mscorwks.dll2.0.50727.30685,815,80816-Sep-200813:13x86
Mscordacwks.dll2.0.50727.30681,767,94416-Sep-200810:33x64
Mscorjit.dll2.0.50727.30681,580,03216-Sep-200810:33x64
Mscorlib.dll2.0.50727.30684,562,94416-Sep-200810:33x64
Mscorwks.dll2.0.50727.306810,079,74416-Sep-200810:33x64
Windows 2000, Windows XP et Windows Server 2003, les versions IA-64
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
Mscordacwks.dll2.0.50727.3068992,26416-Sep-200813:13x86
Mscorjit.dll2.0.50727.3068367,10416-Sep-200813:13x86
Mscorlib.dll2.0.50727.30684,546,56016-Sep-200813:13x86
Mscorwks.dll2.0.50727.30685,815,80816-Sep-200813:13x86
Mscordacwks.dll2.0.50727.30683,087,88016-Sep-200810:44IA-64
Mscorjit.dll2.0.50727.30682,560,51216-Sep-200810:44IA-64
Mscorlib.dll2.0.50727.30684,005,88816-Sep-200810:44IA-64
Mscorwks.dll2.0.50727.306820,153,85616-Sep-200810:44IA-64
Windows Vista Service Pack 1 (SP1) et Windows Server 2008, x86 les versions
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
Mscorlib.resources.dll2.0.50727.3053352,25615-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053303,10415-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053299,00815-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053315,39227-Jul-200817:58x86
Mscorlib.resources.dll2.0.50727.3053425,98415-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053307 20027-Jul-200817:58x86
Mscorlib.resources.dll2.0.50727.3053299,00815-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053311,29627-Jul-200817:58x86
Mscorlib.resources.dll2.0.50727.3053331,77615-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053315,39215-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053307 20027-Jul-200817:55x86
Mscorlib.resources.dll2.0.50727.3053348,16027-Jul-200817:58x86
Mscorlib.resources.dll2.0.50727.3053319,48827-Jul-200817:55x86
Mscorlib.resources.dll2.0.50727.3053290,81615-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053303,10415-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053311,29615-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053303,10427-Jul-200817:55x86
Mscorlib.resources.dll2.0.50727.3053307 20015-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.1434397,31211-Jan-200822:59x86
Mscorlib.resources.dll2.0.50727.3053299,00815-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053299,00815-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053278,52827-Jul-200817:55x86
Mscorlib.resources.dll2.0.50727.3053278,52827-Jul-200817:55x86
Big5.nlpNe s'applique pas66,72818-Dec-200721:03Ne s'applique pas
Bopomofo.nlpNe s'applique pas82,17218-Dec-200721:03Ne s'applique pas
Ksc.nlpNe s'applique pas116,75618-Dec-200721:04Ne s'applique pas
Mscorlib.dll2.0.50727.30684,546,56001-Oct-200822:27x86
Normidna.nlpNe s'applique pas59,34218-Dec-200721:05Ne s'applique pas
Normnfc.nlpNe s'applique pas45,79418-Dec-200721:05Ne s'applique pas
Normnfd.nlpNe s'applique pas39,28418-Dec-200721:05Ne s'applique pas
Normnfkc.nlpNe s'applique pas66,38418-Dec-200721:05Ne s'applique pas
Normnfkd.nlpNe s'applique pas60,29418-Dec-200721:05Ne s'applique pas
Prc.nlpNe s'applique pas83,74818-Dec-200721:05Ne s'applique pas
Prcp.nlpNe s'applique pas83,74818-Dec-200721:05Ne s'applique pas
Sortkey.nlpNe s'applique pas262,14818-Dec-200721:05Ne s'applique pas
Sorttbls.nlpNe s'applique pas20,32018-Dec-200721:05Ne s'applique pas
Xjis.nlpNe s'applique pas28,28818-Dec-200721:05Ne s'applique pas
Mscordacwks.dll2.0.50727.3068992,26401-Oct-200822:27x86
Mscorjit.dll2.0.50727.3068367,10424-Sep-200822:21x86
Mscorwks.dll2.0.50727.30685,815,80801-Oct-200822:27x86
Windows Vista SP1 et Windows Server 2008, x64 les versions
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
Big5.nlpNe s'applique pas66,72818-Dec-200721:01Ne s'applique pas
Bopomofo.nlpNe s'applique pas82,17218-Dec-200721:01Ne s'applique pas
Ksc.nlpNe s'applique pas116,75618-Dec-200721:02Ne s'applique pas
Mscorlib.dll2.0.50727.30684,562,94401-Oct-200822:25x64
Normidna.nlpNe s'applique pas59,34218-Dec-200721:03Ne s'applique pas
Normnfc.nlpNe s'applique pas45,79418-Dec-200721:03Ne s'applique pas
Normnfd.nlpNe s'applique pas39,28418-Dec-200721:03Ne s'applique pas
Normnfkc.nlpNe s'applique pas66,38418-Dec-200721:03Ne s'applique pas
Normnfkd.nlpNe s'applique pas60,29418-Dec-200721:03Ne s'applique pas
Prc.nlpNe s'applique pas83,74818-Dec-200721:03Ne s'applique pas
Prcp.nlpNe s'applique pas83,74818-Dec-200721:03Ne s'applique pas
Sortkey.nlpNe s'applique pas262,14818-Dec-200721:03Ne s'applique pas
Sorttbls.nlpNe s'applique pas20,32018-Dec-200721:03Ne s'applique pas
Xjis.nlpNe s'applique pas28,28818-Dec-200721:03Ne s'applique pas
Mscordacwks.dll2.0.50727.30681,767,94401-Oct-200822:25x64
Mscorjit.dll2.0.50727.30681,580,03224-Sep-200823:06x64
Mscorwks.dll2.0.50727.306810,079,74401-Oct-200822:25x64
Mscorlib.resources.dll2.0.50727.3053352,25615-Sep-200822:26x86
Mscorlib.resources.dll2.0.50727.3053303,10415-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053299,00815-Sep-200822:26x86
Mscorlib.resources.dll2.0.50727.3053315,39227-Jul-200818:02x86
Mscorlib.resources.dll2.0.50727.3053425,98415-Sep-200822:26x86
Mscorlib.resources.dll2.0.50727.3053307 20027-Jul-200818:02x86
Mscorlib.resources.dll2.0.50727.3053299,00815-Sep-200822:26x86
Mscorlib.resources.dll2.0.50727.3053311,29627-Jul-200818:02x86
Mscorlib.resources.dll2.0.50727.3053331,77615-Sep-200822:26x86
Mscorlib.resources.dll2.0.50727.3053315,39215-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053307 20027-Jul-200817:56x86
Mscorlib.resources.dll2.0.50727.3053348,16027-Jul-200818:02x86
Mscorlib.resources.dll2.0.50727.3053319,48827-Jul-200817:56x86
Mscorlib.resources.dll2.0.50727.3053290,81615-Sep-200822:26x86
Mscorlib.resources.dll2.0.50727.3053303,10415-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053311,29615-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053303,10427-Jul-200817:56x86
Mscorlib.resources.dll2.0.50727.3053307 20015-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.1434397,31211-Jan-200822:59x86
Mscorlib.resources.dll2.0.50727.3053299,00815-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053299,00815-Sep-200822:25x86
Mscorlib.resources.dll2.0.50727.3053278,52827-Jul-200817:56x86
Mscorlib.resources.dll2.0.50727.3053278,52827-Jul-200817:56x86
Big5.nlpNe s'applique pas66,72818-Dec-200721:03Ne s'applique pas
Bopomofo.nlpNe s'applique pas82,17218-Dec-200721:03Ne s'applique pas
Ksc.nlpNe s'applique pas116,75618-Dec-200721:04Ne s'applique pas
Mscorlib.dll2.0.50727.30684,546,56001-Oct-200822:27x86
Normidna.nlpNe s'applique pas59,34218-Dec-200721:05Ne s'applique pas
Normnfc.nlpNe s'applique pas45,79418-Dec-200721:05Ne s'applique pas
Normnfd.nlpNe s'applique pas39,28418-Dec-200721:05Ne s'applique pas
Normnfkc.nlpNe s'applique pas66,38418-Dec-200721:05Ne s'applique pas
Normnfkd.nlpNe s'applique pas60,29418-Dec-200721:05Ne s'applique pas
Prc.nlpNe s'applique pas83,74818-Dec-200721:05Ne s'applique pas
Prcp.nlpNe s'applique pas83,74818-Dec-200721:05Ne s'applique pas
Sortkey.nlpNe s'applique pas262,14818-Dec-200721:05Ne s'applique pas
Sorttbls.nlpNe s'applique pas20,32018-Dec-200721:05Ne s'applique pas
Xjis.nlpNe s'applique pas28,28818-Dec-200721:05Ne s'applique pas
Mscordacwks.dll2.0.50727.3068992,26401-Oct-200822:27x86
Mscorjit.dll2.0.50727.3068367,10424-Sep-200822:21x86
Mscorwks.dll2.0.50727.30685,815,80801-Oct-200822:27x86
Windows Vista SP1 et Windows Server 2008, versions IA-64
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
Big5.nlpNe s'applique pas66,72818-Dec-200721:06Ne s'applique pas
Bopomofo.nlpNe s'applique pas82,17218-Dec-200721:06Ne s'applique pas
Ksc.nlpNe s'applique pas116,75618-Dec-200721:06Ne s'applique pas
Mscorlib.dll2.0.50727.30684,005,88801-Oct-200822:26IA-64
Normidna.nlpNe s'applique pas59,34218-Dec-200721:08Ne s'applique pas
Normnfc.nlpNe s'applique pas45,79418-Dec-200721:08Ne s'applique pas
Normnfd.nlpNe s'applique pas39,28418-Dec-200721:08Ne s'applique pas
Normnfkc.nlpNe s'applique pas66,38418-Dec-200721:08Ne s'applique pas
Normnfkd.nlpNe s'applique pas60,29418-Dec-200721:08Ne s'applique pas
Prc.nlpNe s'applique pas83,74818-Dec-200721:08Ne s'applique pas
Prcp.nlpNe s'applique pas83,74818-Dec-200721:08Ne s'applique pas
Sortkey.nlpNe s'applique pas262,14818-Dec-200721:08Ne s'applique pas
Sorttbls.nlpNe s'applique pas20,32018-Dec-200721:08Ne s'applique pas
Xjis.nlpNe s'applique pas28,28818-Dec-200721:08Ne s'applique pas
Mscordacwks.dll2.0.50727.30683,087,88001-Oct-200822:26IA-64
Mscorjit.dll2.0.50727.30682,560,51224-Sep-200823:14IA-64
Mscorwks.dll2.0.50727.306820,153,85601-Oct-200822:26IA-64
Mscorlib.resources.dll2.0.50727.3053315,39227-Jul-200817:58x86
Mscorlib.resources.dll2.0.50727.3053311,29627-Jul-200817:58x86
Mscorlib.resources.dll2.0.50727.3053348,16027-Jul-200817:58x86
Mscorlib.resources.dll2.0.50727.3053319,48827-Jul-200817:58x86
Mscorlib.resources.dll2.0.50727.3053278,52827-Jul-200817:58x86
Mscorlib.resources.dll2.0.50727.3053278,52827-Jul-200817:59x86
Big5.nlpNe s'applique pas66,72818-Dec-200721:03Ne s'applique pas
Bopomofo.nlpNe s'applique pas82,17218-Dec-200721:03Ne s'applique pas
Ksc.nlpNe s'applique pas116,75618-Dec-200721:04Ne s'applique pas
Mscorlib.dll2.0.50727.30684,546,56001-Oct-200822:27x86
Normidna.nlpNe s'applique pas59,34218-Dec-200721:05Ne s'applique pas
Normnfc.nlpNe s'applique pas45,79418-Dec-200721:05Ne s'applique pas
Normnfd.nlpNe s'applique pas39,28418-Dec-200721:05Ne s'applique pas
Normnfkc.nlpNe s'applique pas66,38418-Dec-200721:05Ne s'applique pas
Normnfkd.nlpNe s'applique pas60,29418-Dec-200721:05Ne s'applique pas
Prc.nlpNe s'applique pas83,74818-Dec-200721:05Ne s'applique pas
Prcp.nlpNe s'applique pas83,74818-Dec-200721:05Ne s'applique pas
Sortkey.nlpNe s'applique pas262,14818-Dec-200721:05Ne s'applique pas
Sorttbls.nlpNe s'applique pas20,32018-Dec-200721:05Ne s'applique pas
Xjis.nlpNe s'applique pas28,28818-Dec-200721:05Ne s'applique pas
Mscordacwks.dll2.0.50727.3068992,26401-Oct-200822:27x86
Mscorjit.dll2.0.50727.3068367,10424-Sep-200822:21x86
Mscorwks.dll2.0.50727.30685,815,80801-Oct-200822:27x86

Solution de contournement

Pour contourner ce problème, appliquez l’une des méthodes suivantes.

Méthode 1

Si le code d’application ressemble à l’exemple de code dans la section « Informations complémentaires », recherchez la ligne de code suivante.
#define GETVECTOR3D(vec3d) (*reinterpret_cast<AcGeVector3d*>(&((vec3d).m_x))
Modifiez cette ligne de code comme suit.
#define GETVECTOR3D(vec3d) (*reinterpret_cast<AcGeVector3d*>(&((vec3d)))

Méthode 2

Déployer un fichier .ini. Pour ce faire, créez un fichier qui contient le code suivant.
[.NET Framework Debugging Control]AllowOptimize=0

Nom du fichier .ini du même module problématique, mais utiliser l’extension .ini au lieu de l’extension .dll. Par exemple, pour l’exemple de code dans la section « Informations complémentaires », nommez le fichier .ini le fichier Bug.ini. Placez le fichier Bug.ini dans le même répertoire que le fichier Bug.dll.

Remarque L’inconvénient de cette méthode est l’effet potentiel de performances pour aucune optimisation. Si vous utilisez le Générateur d’images natives (Ngen.exe) pour précompiler le module, cette méthode n’est pas applicable.

Méthode 3

Appliquer de manière sélective l’option NoOptimization de l’énumération MethodImplOptions pour les méthodes qui pose problème à l’aide de la classe MethodImplAttribute .

Remarque Cette méthode désactive les optimisations du compilateur JIT et Native Image Generator (Ngen.exe) sur un niveau de méthode. Combien les performances sont affectées varient en fonction de la méthode.

État

Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés dans la section « S'applique à ».

Plus d'informations

Procédure pour reproduire le problème

  1. Créez une application C++ qui est basée sur le.NET Framework 3.5 SP1.
  2. Ajouter un fichier .cpp au projet et nommez ce fichier le fichier Bug.cpp, puis collez le code suivant dans le fichier Bug.cpp.
    #using <mscorlib.dll>#include <stdlib.h>
    class AcGeVector3d
    {
    double x, y, z;
    public:
    __forceinline AcGeVector3d(const AcGeVector3d& src): x(src.x),y(src.y),z(src.z)
    {
    }
    __forceinline AcGeVector3d(double xx, double yy, double zz) : x(xx),y(yy),z(zz)
    {
    }
    __forceinline AcGeVector3d operator / (double val) const
    {
    return AcGeVector3d (x/val, y/val, z/val);
    }
    };
    #define GETVECTOR3D(vec3d) (*reinterpret_cast<AcGeVector3d*>(&((vec3d).m_x)))
    namespace Geometry
    {
    [System::Runtime::InteropServices::StructLayout(System::Runtime::InteropServices::LayoutKind::Sequential)]
    public value class Vector3d
    {
    internal:
    double m_x, m_y, m_z;
    Vector3d(const AcGeVector3d* obj)
    {
    GETVECTOR3D(*this) = *obj;
    }
    public:
    Vector3d(double x, double y, double z):m_x(x),m_y(y), m_z(z) {}
    Vector3d DivideBy(double value)
    {
    return Vector3d(&GETVECTOR3D(*this).operator /(value));
    }
    virtual System::String^ ToString() override
    {
    return System::String::Format("{0}, {1}, {2}", m_x, m_y, m_z);
    }
    };
    }

  3. Pour compiler le fichier Bug.cpp, exécutez la commande suivante :
    cl /clr /GL/O2 bug.cpp /link /dll /out:bug.dll
  4. Créez un projet Microsoft Visual C# à utiliser en tant que le projet client.
  5. Nommez le fichier de code du fichier Test.cs et puis collez le code suivant dans le fichier Test.cs.
    using Geometry;namespace Test
    {
    class Tester
    {
    static void Main()
    {
    Vector3d v = new Vector3d(200, 200, 0);
    v = v.DivideBy(150);
    System.Console.WriteLine("{0}", v);
    }
    }
    }

  6. Pour compiler le fichier Test.cs, exécutez la commande suivante :
    csc /r:bug.dll test.cs
  7. Pour incorporer le manifeste dans le fichier Test.exe, exécutez la commande suivante :
    MT.exe - nologo-manifeste de bug.dll.manifest-outputresource:test.exe;1
  8. Exécutez le fichier Test.exe.
Notez que le résultat réel est le suivant :
1.33333333333333, 1.333333333333, 0
Toutefois, le résultat attendu est le suivant :
1.33333333333333, 0, 0

Références

Pour plus d'informations sur la terminologie de mise à jour logicielle, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
Description 824684 terminologie standard utilisée pour décrire les mises à jour logicielles de Microsoft
Propriétés

ID d'article : 957542 - Dernière mise à jour : 13 janv. 2017 - Révision : 1

Commentaires