CORRECTIF : Sur un ordinateur qui exécute .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

S’applique à
.NET Framework 3.5 Service Pack 1

Symptômes

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

Ce problème se produit lorsque les conditions suivantes sont remplies :

  • Le struct ou la classe dans le code source a moins de quatre variétés 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 se produit en raison d’une régression dans .NET Framework 3.5 SP1.

Résolution

Informations sur le correctif logiciel

Un correctif logiciel pris en charge est disponible auprès de Microsoft. Toutefois, il est conçu uniquement pour corriger le problème décrit dans cet article. Appliquez ce correctif logiciel uniquement aux systèmes qui rencontrent ce problème spécifique. Ce correctif logiciel va peut-être subir des tests supplémentaires. Ainsi, si vous n'êtes pas sérieusement concerné par ce problème, il est recommandé d'attendre la prochaine mise à jour logicielle qui contiendra ce correctif.

Pour télécharger ce correctif logiciel à partir de MSDN Code Gallery, visitez le site web Microsoft suivant :

http://code.msdn.microsoft.com/KB957542
Remarque Msdn Code Gallery affiche les langues pour lesquelles le correctif logiciel est disponible. Si vous ne voyez pas votre langue répertoriée, c’est que la page de ressources De la galerie de codes n’est pas disponible pour cette langue.

Remarque Si des problèmes supplémentaires surviennent ou si des procédures de dépannage sont nécessaires, vous devrez peut-être créer une demande de service distincte. Les coûts habituels du support s'appliqueront aux autres questions et problèmes du support non directement liés au correctif logiciel en question. Pour obtenir la liste complète des numéros de téléphone des services d'assistance technique Microsoft ou pour créer une demande de service distincte, reportez-vous au site web de Microsoft à l'adresse suivante :

http://support.microsoft.com/contactus/?ws=support Remarque Si vous disposez d’une application 32 bits qui s’exécute sur une plateforme 64 bits, appliquez le correctif logiciel pour la version 64 bits pour résoudre ce problème.

Configuration requise

Le .NET Framework 3.5 SP1 doit être installé pour appliquer ce correctif.

Nécessité de redémarrer

Vous devrez peut-être redémarrer l’ordinateur si l’un des fichiers mis à jour est utilisé.

Informations sur le remplacement des correctifs logiciels

Ce correctif logiciel n'en remplace pas d'autre.

Informations de fichier

La version anglaise de ce correctif logiciel contient les attributs de fichier (ou les attributs de fichier ultérieurs) répertoriés dans le tableau suivant. Les date et heure de création de ces fichiers sont exprimées en temps universel coordonné (UTC). Lorsque vous affichez les informations des fichiers, les données sont converties en heure locale. Pour connaître le décalage entre l’heure UTC et l’heure locale, utilisez l’onglet Fuseau horaire dans l’élément Date et heure du Panneau de configuration.

Windows 2000, Windows XP et Windows Server 2003, versions x86

Nom de fichier Version du fichier Taille du fichier Date Heure
Mscordacwks.dll 2.0.50727.3068 992,264 16-Sep-2008 13 : 13
Mscorjit.dll 2.0.50727.3068 367,104 16-Sep-2008 13 : 13
Mscorlib.dll 2.0.50727.3068 4,546,560 16-Sep-2008 13 : 13
Mscorwks.dll 2.0.50727.3068 5,815,808 16-Sep-2008 13 : 13

Windows 2000, Windows XP et Windows Server 2003, versions x64

Nom de fichier Version du fichier Taille du fichier Date Heure Plateforme
Mscordacwks.dll 2.0.50727.3068 992,264 16-Sep-2008 13 : 13 x86
Mscorjit.dll 2.0.50727.3068 367,104 16-Sep-2008 13 : 13 x86
Mscorlib.dll 2.0.50727.3068 4,546,560 16-Sep-2008 13 : 13 x86
Mscorwks.dll 2.0.50727.3068 5,815,808 16-Sep-2008 13 : 13 x86
Mscordacwks.dll 2.0.50727.3068 1,767,944 16-Sep-2008 10:33 x64
Mscorjit.dll 2.0.50727.3068 1,580,032 16-Sep-2008 10:33 x64
Mscorlib.dll 2.0.50727.3068 4,562,944 16-Sep-2008 10:33 x64
Mscorwks.dll 2.0.50727.3068 10,079,744 16-Sep-2008 10:33 x64

Versions de Windows 2000, Windows XP et Windows Server 2003, IA-64

Nom de fichier Version du fichier Taille du fichier Date Heure Plateforme
Mscordacwks.dll 2.0.50727.3068 992,264 16-Sep-2008 13 : 13 x86
Mscorjit.dll 2.0.50727.3068 367,104 16-Sep-2008 13 : 13 x86
Mscorlib.dll 2.0.50727.3068 4,546,560 16-Sep-2008 13 : 13 x86
Mscorwks.dll 2.0.50727.3068 5,815,808 16-Sep-2008 13 : 13 x86
Mscordacwks.dll 2.0.50727.3068 3,087,880 16-Sep-2008 1,044 IA-64
Mscorjit.dll 2.0.50727.3068 2,560,512 16-Sep-2008 1,044 IA-64
Mscorlib.dll 2.0.50727.3068 4,005,888 16-Sep-2008 1,044 IA-64
Mscorwks.dll 2.0.50727.3068 20,153,856 16-Sep-2008 1,044 IA-64

Windows Vista Service Pack 1 (SP1) et Windows Server 2008, versions x86

Nom de fichier Version du fichier Taille du fichier Date Heure Plateforme
Mscorlib.resources.dll 2.0.50727.3053 352,256 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 303 104 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 299 008 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 315,392 27-Juil-2008 1,758 x86
Mscorlib.resources.dll 2.0.50727.3053 425,984 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 307 200 27-Juil-2008 1,758 x86
Mscorlib.resources.dll 2.0.50727.3053 299 008 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 311,296 27-Juil-2008 1,758 x86
Mscorlib.resources.dll 2.0.50727.3053 331,776 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 315,392 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 307 200 27-Juil-2008 17:55 x86
Mscorlib.resources.dll 2.0.50727.3053 348,160 27-Juil-2008 1,758 x86
Mscorlib.resources.dll 2.0.50727.3053 319,488 27-Juil-2008 17:55 x86
Mscorlib.resources.dll 2.0.50727.3053 290 816 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 303 104 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 311,296 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 303 104 27-Juil-2008 17:55 x86
Mscorlib.resources.dll 2.0.50727.3053 307 200 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.1434 397,312 11-Jan-2008 22:59 x86
Mscorlib.resources.dll 2.0.50727.3053 299 008 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 299 008 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 278,528 27-Juil-2008 17:55 x86
Mscorlib.resources.dll 2.0.50727.3053 278,528 27-Juil-2008 17:55 x86
Big5.nlp Non applicable 66,728 18-Déc-2007 21:03 Non applicable
Bopomofo.nlp Non applicable 82,172 18-Déc-2007 21:03 Non applicable
Ksc.nlp Non applicable 116,756 18-Déc-2007 21:04 Non applicable
Mscorlib.dll 2.0.50727.3068 4,546,560 01/01/2008 22:27 x86
Normidna.nlp Non applicable 59,342 18-Déc-2007 21:05 Non applicable
Normnfc.nlp Non applicable 45,794 18-Déc-2007 21:05 Non applicable
Normnfd.nlp Non applicable 39,284 18-Déc-2007 21:05 Non applicable
Normnfkc.nlp Non applicable 66,384 18-Déc-2007 21:05 Non applicable
Normnfkd.nlp Non applicable 60,294 18-Déc-2007 21:05 Non applicable
Prc.nlp Non applicable 83,748 18-Déc-2007 21:05 Non applicable
Prcp.nlp Non applicable 83,748 18-Déc-2007 21:05 Non applicable
Sortkey.nlp Non applicable 262,148 18-Déc-2007 21:05 Non applicable
Sorttbls.nlp Non applicable 20,320 18-Déc-2007 21:05 Non applicable
Xjis.nlp Non applicable 28,288 18-Déc-2007 21:05 Non applicable
Mscordacwks.dll 2.0.50727.3068 992,264 01/01/2008 22:27 x86
Mscorjit.dll 2.0.50727.3068 367,104 24-Sep-2008 2,221 x86
Mscorwks.dll 2.0.50727.3068 5,815,808 01/01/2008 22:27 x86

Windows Vista SP1 et Windows Server 2008, versions x64

Nom de fichier Version du fichier Taille du fichier Date Heure Plateforme
Big5.nlp Non applicable 66,728 18-Déc-2007 21:01 Non applicable
Bopomofo.nlp Non applicable 82,172 18-Déc-2007 21:01 Non applicable
Ksc.nlp Non applicable 116,756 18-Déc-2007 21:02 Non applicable
Mscorlib.dll 2.0.50727.3068 4,562,944 01/01/2008 2,225 x64
Normidna.nlp Non applicable 59,342 18-Déc-2007 21:03 Non applicable
Normnfc.nlp Non applicable 45,794 18-Déc-2007 21:03 Non applicable
Normnfd.nlp Non applicable 39,284 18-Déc-2007 21:03 Non applicable
Normnfkc.nlp Non applicable 66,384 18-Déc-2007 21:03 Non applicable
Normnfkd.nlp Non applicable 60,294 18-Déc-2007 21:03 Non applicable
Prc.nlp Non applicable 83,748 18-Déc-2007 21:03 Non applicable
Prcp.nlp Non applicable 83,748 18-Déc-2007 21:03 Non applicable
Sortkey.nlp Non applicable 262,148 18-Déc-2007 21:03 Non applicable
Sorttbls.nlp Non applicable 20,320 18-Déc-2007 21:03 Non applicable
Xjis.nlp Non applicable 28,288 18-Déc-2007 21:03 Non applicable
Mscordacwks.dll 2.0.50727.3068 1,767,944 01/01/2008 2,225 x64
Mscorjit.dll 2.0.50727.3068 1,580,032 24-Sep-2008 23:06 x64
Mscorwks.dll 2.0.50727.3068 10,079,744 01/01/2008 2,225 x64
Mscorlib.resources.dll 2.0.50727.3053 352,256 15-Sep-2008 01:22:26 AM x86
Mscorlib.resources.dll 2.0.50727.3053 303 104 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 299 008 15-Sep-2008 01:22:26 AM x86
Mscorlib.resources.dll 2.0.50727.3053 315,392 27-Juil-2008 18:02 x86
Mscorlib.resources.dll 2.0.50727.3053 425,984 15-Sep-2008 01:22:26 AM x86
Mscorlib.resources.dll 2.0.50727.3053 307 200 27-Juil-2008 18:02 x86
Mscorlib.resources.dll 2.0.50727.3053 299 008 15-Sep-2008 01:22:26 AM x86
Mscorlib.resources.dll 2.0.50727.3053 311,296 27-Juil-2008 18:02 x86
Mscorlib.resources.dll 2.0.50727.3053 331,776 15-Sep-2008 01:22:26 AM x86
Mscorlib.resources.dll 2.0.50727.3053 315,392 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 307 200 27-Juil-2008 17:56 x86
Mscorlib.resources.dll 2.0.50727.3053 348,160 27-Juil-2008 18:02 x86
Mscorlib.resources.dll 2.0.50727.3053 319,488 27-Juil-2008 17:56 x86
Mscorlib.resources.dll 2.0.50727.3053 290 816 15-Sep-2008 01:22:26 AM x86
Mscorlib.resources.dll 2.0.50727.3053 303 104 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 311,296 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 303 104 27-Juil-2008 17:56 x86
Mscorlib.resources.dll 2.0.50727.3053 307 200 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.1434 397,312 11-Jan-2008 22:59 x86
Mscorlib.resources.dll 2.0.50727.3053 299 008 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 299 008 15-Sep-2008 2,225 x86
Mscorlib.resources.dll 2.0.50727.3053 278,528 27-Juil-2008 17:56 x86
Mscorlib.resources.dll 2.0.50727.3053 278,528 27-Juil-2008 17:56 x86
Big5.nlp Non applicable 66,728 18-Déc-2007 21:03 Non applicable
Bopomofo.nlp Non applicable 82,172 18-Déc-2007 21:03 Non applicable
Ksc.nlp Non applicable 116,756 18-Déc-2007 21:04 Non applicable
Mscorlib.dll 2.0.50727.3068 4,546,560 01/01/2008 22:27 x86
Normidna.nlp Non applicable 59,342 18-Déc-2007 21:05 Non applicable
Normnfc.nlp Non applicable 45,794 18-Déc-2007 21:05 Non applicable
Normnfd.nlp Non applicable 39,284 18-Déc-2007 21:05 Non applicable
Normnfkc.nlp Non applicable 66,384 18-Déc-2007 21:05 Non applicable
Normnfkd.nlp Non applicable 60,294 18-Déc-2007 21:05 Non applicable
Prc.nlp Non applicable 83,748 18-Déc-2007 21:05 Non applicable
Prcp.nlp Non applicable 83,748 18-Déc-2007 21:05 Non applicable
Sortkey.nlp Non applicable 262,148 18-Déc-2007 21:05 Non applicable
Sorttbls.nlp Non applicable 20,320 18-Déc-2007 21:05 Non applicable
Xjis.nlp Non applicable 28,288 18-Déc-2007 21:05 Non applicable
Mscordacwks.dll 2.0.50727.3068 992,264 01/01/2008 22:27 x86
Mscorjit.dll 2.0.50727.3068 367,104 24-Sep-2008 2,221 x86
Mscorwks.dll 2.0.50727.3068 5,815,808 01/01/2008 22:27 x86

Windows Vista SP1 et Windows Server 2008, versions IA-64

Nom de fichier Version du fichier Taille du fichier Date Heure Plateforme
Big5.nlp Non applicable 66,728 18-Déc-2007 21:06 Non applicable
Bopomofo.nlp Non applicable 82,172 18-Déc-2007 21:06 Non applicable
Ksc.nlp Non applicable 116,756 18-Déc-2007 21:06 Non applicable
Mscorlib.dll 2.0.50727.3068 4,005,888 01/01/2008 01:22:26 AM IA-64
Normidna.nlp Non applicable 59,342 18-Déc-2007 21:08 Non applicable
Normnfc.nlp Non applicable 45,794 18-Déc-2007 21:08 Non applicable
Normnfd.nlp Non applicable 39,284 18-Déc-2007 21:08 Non applicable
Normnfkc.nlp Non applicable 66,384 18-Déc-2007 21:08 Non applicable
Normnfkd.nlp Non applicable 60,294 18-Déc-2007 21:08 Non applicable
Prc.nlp Non applicable 83,748 18-Déc-2007 21:08 Non applicable
Prcp.nlp Non applicable 83,748 18-Déc-2007 21:08 Non applicable
Sortkey.nlp Non applicable 262,148 18-Déc-2007 21:08 Non applicable
Sorttbls.nlp Non applicable 20,320 18-Déc-2007 21:08 Non applicable
Xjis.nlp Non applicable 28,288 18-Déc-2007 21:08 Non applicable
Mscordacwks.dll 2.0.50727.3068 3,087,880 01/01/2008 01:22:26 AM IA-64
Mscorjit.dll 2.0.50727.3068 2,560,512 24-Sep-2008 23:14 IA-64
Mscorwks.dll 2.0.50727.3068 20,153,856 01/01/2008 01:22:26 AM IA-64
Mscorlib.resources.dll 2.0.50727.3053 315,392 27-Juil-2008 1,758 x86
Mscorlib.resources.dll 2.0.50727.3053 311,296 27-Juil-2008 1,758 x86
Mscorlib.resources.dll 2.0.50727.3053 348,160 27-Juil-2008 1,758 x86
Mscorlib.resources.dll 2.0.50727.3053 319,488 27-Juil-2008 1,758 x86
Mscorlib.resources.dll 2.0.50727.3053 278,528 27-Juil-2008 1,758 x86
Mscorlib.resources.dll 2.0.50727.3053 278,528 27-Juil-2008 1,759 x86
Big5.nlp Non applicable 66,728 18-Déc-2007 21:03 Non applicable
Bopomofo.nlp Non applicable 82,172 18-Déc-2007 21:03 Non applicable
Ksc.nlp Non applicable 116,756 18-Déc-2007 21:04 Non applicable
Mscorlib.dll 2.0.50727.3068 4,546,560 01/01/2008 22:27 x86
Normidna.nlp Non applicable 59,342 18-Déc-2007 21:05 Non applicable
Normnfc.nlp Non applicable 45,794 18-Déc-2007 21:05 Non applicable
Normnfd.nlp Non applicable 39,284 18-Déc-2007 21:05 Non applicable
Normnfkc.nlp Non applicable 66,384 18-Déc-2007 21:05 Non applicable
Normnfkd.nlp Non applicable 60,294 18-Déc-2007 21:05 Non applicable
Prc.nlp Non applicable 83,748 18-Déc-2007 21:05 Non applicable
Prcp.nlp Non applicable 83,748 18-Déc-2007 21:05 Non applicable
Sortkey.nlp Non applicable 262,148 18-Déc-2007 21:05 Non applicable
Sorttbls.nlp Non applicable 20,320 18-Déc-2007 21:05 Non applicable
Xjis.nlp Non applicable 28,288 18-Déc-2007 21:05 Non applicable
Mscordacwks.dll 2.0.50727.3068 992,264 01/01/2008 22:27 x86
Mscorjit.dll 2.0.50727.3068 367,104 24-Sep-2008 2,221 x86
Mscorwks.dll 2.0.50727.3068 5,815,808 01/01/2008 22:27 x86

Solution de contournement

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

Méthode 1

Si le code de l’application ressemble à l’exemple de code dans la section « Plus d’informations », 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éployez un fichier .ini. Pour ce faire, créez un fichier qui contient le code suivant.

[.NET Framework Debugging Control]
AllowOptimize=0

Nommez le fichier .ini de la même façon que le module problématique, mais utilisez l’extension .ini au lieu de l’extension .dll. Par exemple, pour l’exemple de code dans la section « Plus d’informations », nommez le fichier .ini 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 sur les performances pour aucune optimisation. Si vous utilisez native Image Generator (Ngen.exe) pour précompiler le module, cette méthode n’est pas applicable.

Méthode 3

Appliquez de manière sélective l’option NoOptimization de l’énumération MethodImplOptions aux méthodes problématiques à l’aide de la classe MethodImplAttribute.

Remarque Cette méthode désactive les optimisations du compilateur JIT et du générateur d’images natives (Ngen.exe) au niveau de chaque méthode. La mesure dans laquelle les performances sont affectées varie en fonction de la méthode.

État

Microsoft a confirmé qu’il s’agissait d’un problème dans les produits Microsoft répertoriés dans la section « S’applique à ».

Informations supplémentaires

Procédure pour reproduire le problème

  1. Créez une application C++ basée sur .NET Framework 3.5 SP1.

  2. Ajoutez un fichier .cpp au projet, 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 comme projet client.

  5. Nommez le fichier de code Test.cs fichier, 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 -manifest 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.333333333333333, 1.3333333333333, 0 Toutefois, le résultat attendu est le suivant :

1.333333333333333, 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 :

824684 Terminologie standard utilisée pour décrire les mises à jour logicielles Microsoft