Korriger: På en datamaskin som kjører .NET Framework 3.5 Service Pack 1, JIT-kompilator og Native Image Generator (Ngen.exe) som bruker Mscorjit.dll-filen kan generere feil kode

Gjelder: .NET Framework 3.5 Service Pack 1

Symptomer


På en datamaskin som kjører Microsoft.NET Framework 3.5 Service Pack 1 (SP1), kan just-in-time (JIT) kompilator og Native Image Generator (Ngen.exe) som bruker Mscorjit.dll-filen generere feil kode. En 32-biters administrert C++-program kan derfor gi ukorrekte resultater.

Dette problemet oppstår hvis følgende betingelser er oppfylt:
  • Strukturen eller klassen i kildekoden har mindre enn fire artene skalerbare og ingen referanser til forvaltet objekt.
  • Du bruker Cpblk-instruksjon eller Initblk instruksjonen.
Obs! Dette problemet oppstår ikke i et 64-biters program.

Årsak


Dette problemet oppstår på grunn av en regresjon i .NET Framework 3.5 SP1.

Oppløsning


Informasjon om hurtigreparasjon

En støttet hurtigreparasjon er tilgjengelig fra Microsoft. Denne hurtigreparasjonen er imidlertid ment å løse problemet som er beskrevet i denne artikkelen. Bruk denne hurtigreparasjonen bare på systemer som har dette bestemte problemet. Denne hurtigreparasjonen kan gjennomgå ytterligere testing. Hvis du ikke er alvorlig påvirket av dette problemet, anbefaler vi derfor at du venter på neste programvareoppdatering som inneholder denne hurtigreparasjonen.

Hvis du vil laste ned denne hurtigreparasjonen fra galleriet for MSDN-kode, kan du gå til følgende Microsoft-webområde:


Obs! Galleriet for MSDN-kode viser språkene hurtigreparasjonen er tilgjengelig. Hvis du ikke ser språket ditt er oppført, er det fordi ressurs kode galleriside ikke er tilgjengelig for dette språket.


Obs! Hvis det oppstår andre problemer, eller hvis feilsøkingstips, må du kanskje opprette en separat forespørsel om. Vanlige kundestøttekostnader gjelder for ytterligere kundestøttespørsmål og problemer som ikke dekkes av denne oppdateringen. For en fullstendig liste over telefonnumre for Microsofts kundeservice og kundestøtte eller opprette en separat forespørsel om, kan du gå til følgende Microsoft-webområde:

Obs! Hvis du har en 32-biters program som kjører på et 64-bits plattformen, kan du bruke hurtigreparasjonen for 64-biters-versjonen å løse dette problemet.

Forutsetninger

Du må ha .NET Framework 3.5 SP1 installert for å bruke denne hurtigreparasjonen.

Krav om omstart

Du må kanskje starte datamaskinen på nytt hvis noen av filene som er oppdatert, brukes.

Informasjon om erstatning av hurtigreparasjoner

Denne hurtigreparasjonen erstatter ikke andre hurtigreparasjoner.

Filinformasjon

Den engelskspråklige versjonen av denne hurtigreparasjonen har filattributtene (eller senere filattributter) som er oppført i følgende tabell. Datoene og klokkeslettene for disse filene er oppført i Coordinated Universal Time (UTC). Når du viser filinformasjonen, konverteres den til lokal tid. Hvis du vil finne forskjellen mellom UTC og lokal tid, kan du bruke kategorien tidssone under dato og klokkeslett i Kontrollpanel.
Windows 2000, Windows XP og Windows Server 2003, x86 versjoner
FilnavnFilversjonFilstørrelseDatoTid
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 og Windows Server 2003, x64 versjoner
FilnavnFilversjonFilstørrelseDatoTidPlattform
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 og Windows Server 2003 IA-64-versjoner
FilnavnFilversjonFilstørrelseDatoTidPlattform
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) og Windows Server 2008, x86 versjoner
FilnavnFilversjonFilstørrelseDatoTidPlattform
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.nlpIkke tilgjengelig66,72818-Dec-200721:03Ikke tilgjengelig
Bopomofo.nlpIkke tilgjengelig82,17218-Dec-200721:03Ikke tilgjengelig
Ksc.nlpIkke tilgjengelig116,75618-Dec-200721:04Ikke tilgjengelig
Mscorlib.dll2.0.50727.30684,546,56001-Oct-200822:27x86
Normidna.nlpIkke tilgjengelig59,34218-Dec-200721:05Ikke tilgjengelig
Normnfc.nlpIkke tilgjengelig45,79418-Dec-200721:05Ikke tilgjengelig
Normnfd.nlpIkke tilgjengelig39,28418-Dec-200721:05Ikke tilgjengelig
Normnfkc.nlpIkke tilgjengelig66,38418-Dec-200721:05Ikke tilgjengelig
Normnfkd.nlpIkke tilgjengelig60,29418-Dec-200721:05Ikke tilgjengelig
Prc.nlpIkke tilgjengelig83,74818-Dec-200721:05Ikke tilgjengelig
Prcp.nlpIkke tilgjengelig83,74818-Dec-200721:05Ikke tilgjengelig
Sortkey.nlpIkke tilgjengelig262,14818-Dec-200721:05Ikke tilgjengelig
Sorttbls.nlpIkke tilgjengelig20,32018-Dec-200721:05Ikke tilgjengelig
Xjis.nlpIkke tilgjengelig28,28818-Dec-200721:05Ikke tilgjengelig
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 og Windows Server 2008, x64 versjoner
FilnavnFilversjonFilstørrelseDatoTidPlattform
Big5.nlpIkke tilgjengelig66,72818-Dec-200721:01Ikke tilgjengelig
Bopomofo.nlpIkke tilgjengelig82,17218-Dec-200721:01Ikke tilgjengelig
Ksc.nlpIkke tilgjengelig116,75618-Dec-200721:02Ikke tilgjengelig
Mscorlib.dll2.0.50727.30684,562,94401-Oct-200822:25x64
Normidna.nlpIkke tilgjengelig59,34218-Dec-200721:03Ikke tilgjengelig
Normnfc.nlpIkke tilgjengelig45,79418-Dec-200721:03Ikke tilgjengelig
Normnfd.nlpIkke tilgjengelig39,28418-Dec-200721:03Ikke tilgjengelig
Normnfkc.nlpIkke tilgjengelig66,38418-Dec-200721:03Ikke tilgjengelig
Normnfkd.nlpIkke tilgjengelig60,29418-Dec-200721:03Ikke tilgjengelig
Prc.nlpIkke tilgjengelig83,74818-Dec-200721:03Ikke tilgjengelig
Prcp.nlpIkke tilgjengelig83,74818-Dec-200721:03Ikke tilgjengelig
Sortkey.nlpIkke tilgjengelig262,14818-Dec-200721:03Ikke tilgjengelig
Sorttbls.nlpIkke tilgjengelig20,32018-Dec-200721:03Ikke tilgjengelig
Xjis.nlpIkke tilgjengelig28,28818-Dec-200721:03Ikke tilgjengelig
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.nlpIkke tilgjengelig66,72818-Dec-200721:03Ikke tilgjengelig
Bopomofo.nlpIkke tilgjengelig82,17218-Dec-200721:03Ikke tilgjengelig
Ksc.nlpIkke tilgjengelig116,75618-Dec-200721:04Ikke tilgjengelig
Mscorlib.dll2.0.50727.30684,546,56001-Oct-200822:27x86
Normidna.nlpIkke tilgjengelig59,34218-Dec-200721:05Ikke tilgjengelig
Normnfc.nlpIkke tilgjengelig45,79418-Dec-200721:05Ikke tilgjengelig
Normnfd.nlpIkke tilgjengelig39,28418-Dec-200721:05Ikke tilgjengelig
Normnfkc.nlpIkke tilgjengelig66,38418-Dec-200721:05Ikke tilgjengelig
Normnfkd.nlpIkke tilgjengelig60,29418-Dec-200721:05Ikke tilgjengelig
Prc.nlpIkke tilgjengelig83,74818-Dec-200721:05Ikke tilgjengelig
Prcp.nlpIkke tilgjengelig83,74818-Dec-200721:05Ikke tilgjengelig
Sortkey.nlpIkke tilgjengelig262,14818-Dec-200721:05Ikke tilgjengelig
Sorttbls.nlpIkke tilgjengelig20,32018-Dec-200721:05Ikke tilgjengelig
Xjis.nlpIkke tilgjengelig28,28818-Dec-200721:05Ikke tilgjengelig
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 og Windows Server 2008, IA-64-versjoner
FilnavnFilversjonFilstørrelseDatoTidPlattform
Big5.nlpIkke tilgjengelig66,72818-Dec-200721:06Ikke tilgjengelig
Bopomofo.nlpIkke tilgjengelig82,17218-Dec-200721:06Ikke tilgjengelig
Ksc.nlpIkke tilgjengelig116,75618-Dec-200721:06Ikke tilgjengelig
Mscorlib.dll2.0.50727.30684,005,88801-Oct-200822:26IA-64
Normidna.nlpIkke tilgjengelig59,34218-Dec-200721:08Ikke tilgjengelig
Normnfc.nlpIkke tilgjengelig45,79418-Dec-200721:08Ikke tilgjengelig
Normnfd.nlpIkke tilgjengelig39,28418-Dec-200721:08Ikke tilgjengelig
Normnfkc.nlpIkke tilgjengelig66,38418-Dec-200721:08Ikke tilgjengelig
Normnfkd.nlpIkke tilgjengelig60,29418-Dec-200721:08Ikke tilgjengelig
Prc.nlpIkke tilgjengelig83,74818-Dec-200721:08Ikke tilgjengelig
Prcp.nlpIkke tilgjengelig83,74818-Dec-200721:08Ikke tilgjengelig
Sortkey.nlpIkke tilgjengelig262,14818-Dec-200721:08Ikke tilgjengelig
Sorttbls.nlpIkke tilgjengelig20,32018-Dec-200721:08Ikke tilgjengelig
Xjis.nlpIkke tilgjengelig28,28818-Dec-200721:08Ikke tilgjengelig
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.nlpIkke tilgjengelig66,72818-Dec-200721:03Ikke tilgjengelig
Bopomofo.nlpIkke tilgjengelig82,17218-Dec-200721:03Ikke tilgjengelig
Ksc.nlpIkke tilgjengelig116,75618-Dec-200721:04Ikke tilgjengelig
Mscorlib.dll2.0.50727.30684,546,56001-Oct-200822:27x86
Normidna.nlpIkke tilgjengelig59,34218-Dec-200721:05Ikke tilgjengelig
Normnfc.nlpIkke tilgjengelig45,79418-Dec-200721:05Ikke tilgjengelig
Normnfd.nlpIkke tilgjengelig39,28418-Dec-200721:05Ikke tilgjengelig
Normnfkc.nlpIkke tilgjengelig66,38418-Dec-200721:05Ikke tilgjengelig
Normnfkd.nlpIkke tilgjengelig60,29418-Dec-200721:05Ikke tilgjengelig
Prc.nlpIkke tilgjengelig83,74818-Dec-200721:05Ikke tilgjengelig
Prcp.nlpIkke tilgjengelig83,74818-Dec-200721:05Ikke tilgjengelig
Sortkey.nlpIkke tilgjengelig262,14818-Dec-200721:05Ikke tilgjengelig
Sorttbls.nlpIkke tilgjengelig20,32018-Dec-200721:05Ikke tilgjengelig
Xjis.nlpIkke tilgjengelig28,28818-Dec-200721:05Ikke tilgjengelig
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

Løsningen


Hvis du vil omgå dette problemet, bruker du en av følgende metoder.

Metode 1

Hvis programmet koden ligner eksempelkoden i delen "Mer informasjon", finner du følgende linje med kode.
#define GETVECTOR3D(vec3d) (*reinterpret_cast<AcGeVector3d*>(&((vec3d).m_x))
Endre denne kodelinjen som følger.
#define GETVECTOR3D(vec3d) (*reinterpret_cast<AcGeVector3d*>(&((vec3d)))

Metode 2

Distribuere en INI-fil. Hvis du vil gjøre dette, oppretter du en fil som inneholder følgende kode.
[.NET Framework Debugging Control]AllowOptimize=0

Gi navn til INI-filen den samme som den problematiske modulen, men har filtypen INI i stedet for filtypen DLL. For eksempel for eksempelkode i delen "Mer informasjon", gi navn til INI-filen Bug.ini-fil. Legg Bug.ini-filen i samme mappe som filen Bug.dll.

Obs! Ulempen med denne metoden er virkningen på mulige ytelsen for noen optimaliseringer. Hvis du bruker Native Image Generator (Ngen.exe) for å forhåndskompilere modulen, gjelder ikke denne metoden.

Metode 3

Selektivt gjelde alternativet NoOptimization i MethodImplOptions -opplistingen problematiske metoder ved hjelp av klassen MethodImplAttribute .

Obs! Denne metoden deaktiverer optimaliseringer for JIT-kompilator og Native Image Generator (Ngen.exe) på en per-metoden-nivå. Hvor mye ytelsen påvirkes varierer, avhengig av hvilken metode.

Status


Microsoft har bekreftet at dette er et problem i Microsoft-produktene som er oppført i delen "Gjelder for".

Hvis du vil ha mer informasjon


Fremgangsmåte for å gjenskape problemet

  1. Opprett en C++-program som er basert på .NET Framework 3.5 SP1.
  2. Legge til en fil for .cpp i prosjektet, gi filen navnet Bug.cpp for denne filen og Lim inn følgende kode i filen 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. Hvis du vil kompilere Bug.cpp-filen, kjører du følgende kommando:
    kl /clr /GL /O2 bug.cpp /link /dll /out:bug.dll
  4. Opprette et nytt Microsoft Visual C#-prosjekt som skal brukes som klientprosjektet.
  5. Gi filen navnet koden Test.cs-filen, og deretter lime inn følgende kode i filen 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. Hvis du vil kompilere Test.cs-filen, kjører du følgende kommando:
    CSC-/r:bug.dll test.cs
  7. Hvis du vil bygge inn manifestet i Test.exe-fil, kan du kjøre følgende kommando:
    MT.exe - nologo-manifestet bug.dll.manifest-outputresource:test.exe;1
  8. Kjør filen Test.exe.
Legg merke til at det faktiske resultatet er som følger:
1.33333333333333, 1.333333333333, 0
Imidlertid er det forventede resultatet som følger:
1.33333333333333, 0, 0

Referanser


Hvis du vil ha mer informasjon om terminologi for programvareoppdatering, kan du klikke følgende artikkelnummer for å vise artikkelen i Microsoft Knowledge Base:
824684 beskrivelse av standardterminologien som brukes til å beskrive oppdateringer av Microsoft-programvare