FIX: Op een computer waarop .NET Framework 3.5 Service Pack 1 wordt uitgevoerd, de JIT-compiler en de Native Image Generator (Ngen.exe) waarin het bestand Mscorjit.dll kan onjuiste code genereren

Van toepassing: .NET Framework 3.5 Service Pack 1

Symptomen


Op een computer waarop Microsoft.NET Framework 3.5 servicepack 1 (SP1) wordt uitgevoerd, kan de just-in-time-compileerprogramma (JIT) en de Native Image Generator (Ngen.exe) waarin het bestand Mscorjit.dll onjuiste code genereren. Daarom kan een Managed C++ 32-bits toepassing onjuiste resultaten oplevert.

Dit probleem treedt op als aan de volgende voorwaarden voldaan wordt:
  • De struct of de klasse in de broncode heeft minder dan vier scalaire rassen en geen verwijzingen van beheerde objecten.
  • U gebruikt de instructie cpblk ontbreekt of de instructie Initblk.
Opmerking Dit probleem treedt niet op in een 64-bits toepassing.

Oorzaak


Dit probleem treedt op vanwege een regressie in .NET Framework 3.5 SP1.

Oplossing


Informatie over de hotfix

Een ondersteunde hotfix is beschikbaar bij Microsoft. Deze hotfix is echter alleen bedoeld voor het probleem dat wordt beschreven in dit artikel. Voer deze hotfix alleen uit op systemen waarop dit specifieke probleem zich voordoet. Deze hotfix moet wellicht extra worden getest. Als u geen ernstige hinder ondervindt van dit probleem, is het daarom raadzaam te wachten op de volgende update waarin deze hotfix is opgenomen.

Om deze hotfix te downloaden vanaf de MSDN Code Gallery, gaat u naar de volgende Microsoft-website:


Opmerking De MSDN Code Gallery geeft de talen waarvoor de hotfix beschikbaar is. Als de taal die niet wordt weergegeven, is het omdat de pagina Galerie met Code bron niet beschikbaar voor die taal is.


Opmerking Als er andere problemen optreden of als probleemoplossing is vereist, moet u wellicht een apart serviceverzoek indienen. De normale ondersteuningskosten gelden voor extra ondersteuningsvragen en problemen die niet in aanmerking komen voor deze specifieke hotfix. Voor een volledige lijst met telefoonnummers van Microsoft Customer Service and Support of een afzonderlijk serviceverzoek maken, gaat u naar de volgende Microsoft-website:

Opmerking Als u een 32-bits toepassing die wordt uitgevoerd op een 64-bits platform, de hotfix voor de 64-bits versie naar een oplossing voor dit probleem van toepassing.

Vereisten

U moet .NET Framework 3.5 SP1 zijn geïnstalleerd om deze hotfix te kunnen hebben.

Opnieuw opstarten

U moet de computer opnieuw opstarten als een van de bestanden die zijn bijgewerkt worden gebruikt.

Informatie over het vervangen van hotfixes

Deze hotfix vervangt geen andere hotfixes.

Bestandsinformatie

De Engelse versie van deze hotfix heeft de bestandskenmerken (of recentere bestandskenmerken) die in de volgende tabel worden weergegeven. De datums en tijden voor deze bestanden worden weergegeven in Coordinated Universal Time (UTC). Wanneer u de bestandsinformatie weergeeft, wordt deze naar lokale tijd geconverteerd. Om het verschil tussen UTC en lokale tijd op te zoeken, gebruikt u het tabblad tijdzone in het onderdeel datum en tijd in het Configuratiescherm.
Windows 2000, Windows XP en Windows Server 2003, x86 versies
BestandsnaamBestandsversieBestandsgrootteDatumTijd
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 en Windows Server 2003, x64 versies
BestandsnaamBestandsversieBestandsgrootteDatumTijdPlatform
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 en Windows Server 2003 IA-64-versies
BestandsnaamBestandsversieBestandsgrootteDatumTijdPlatform
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) en Windows Server 2008, x86 versies
BestandsnaamBestandsversieBestandsgrootteDatumTijdPlatform
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.nlpNiet van toepassing66,72818-Dec-200721:03Niet van toepassing
Bopomofo.nlpNiet van toepassing82,17218-Dec-200721:03Niet van toepassing
Ksc.nlpNiet van toepassing116,75618-Dec-200721:04Niet van toepassing
Mscorlib.dll2.0.50727.30684,546,56001-Oct-200822:27x86
Normidna.nlpNiet van toepassing59,34218-Dec-200721:05Niet van toepassing
Normnfc.nlpNiet van toepassing45,79418-Dec-200721:05Niet van toepassing
Normnfd.nlpNiet van toepassing39,28418-Dec-200721:05Niet van toepassing
Normnfkc.nlpNiet van toepassing66,38418-Dec-200721:05Niet van toepassing
Normnfkd.nlpNiet van toepassing60,29418-Dec-200721:05Niet van toepassing
Prc.nlpNiet van toepassing83,74818-Dec-200721:05Niet van toepassing
Prcp.nlpNiet van toepassing83,74818-Dec-200721:05Niet van toepassing
Sortkey.nlpNiet van toepassing262,14818-Dec-200721:05Niet van toepassing
Sorttbls.nlpNiet van toepassing20,32018-Dec-200721:05Niet van toepassing
Xjis.nlpNiet van toepassing28,28818-Dec-200721:05Niet van toepassing
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 en Windows Server 2008, x64 versies
BestandsnaamBestandsversieBestandsgrootteDatumTijdPlatform
Big5.nlpNiet van toepassing66,72818-Dec-200721:01Niet van toepassing
Bopomofo.nlpNiet van toepassing82,17218-Dec-200721:01Niet van toepassing
Ksc.nlpNiet van toepassing116,75618-Dec-200721:02Niet van toepassing
Mscorlib.dll2.0.50727.30684,562,94401-Oct-200822:25x64
Normidna.nlpNiet van toepassing59,34218-Dec-200721:03Niet van toepassing
Normnfc.nlpNiet van toepassing45,79418-Dec-200721:03Niet van toepassing
Normnfd.nlpNiet van toepassing39,28418-Dec-200721:03Niet van toepassing
Normnfkc.nlpNiet van toepassing66,38418-Dec-200721:03Niet van toepassing
Normnfkd.nlpNiet van toepassing60,29418-Dec-200721:03Niet van toepassing
Prc.nlpNiet van toepassing83,74818-Dec-200721:03Niet van toepassing
Prcp.nlpNiet van toepassing83,74818-Dec-200721:03Niet van toepassing
Sortkey.nlpNiet van toepassing262,14818-Dec-200721:03Niet van toepassing
Sorttbls.nlpNiet van toepassing20,32018-Dec-200721:03Niet van toepassing
Xjis.nlpNiet van toepassing28,28818-Dec-200721:03Niet van toepassing
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.nlpNiet van toepassing66,72818-Dec-200721:03Niet van toepassing
Bopomofo.nlpNiet van toepassing82,17218-Dec-200721:03Niet van toepassing
Ksc.nlpNiet van toepassing116,75618-Dec-200721:04Niet van toepassing
Mscorlib.dll2.0.50727.30684,546,56001-Oct-200822:27x86
Normidna.nlpNiet van toepassing59,34218-Dec-200721:05Niet van toepassing
Normnfc.nlpNiet van toepassing45,79418-Dec-200721:05Niet van toepassing
Normnfd.nlpNiet van toepassing39,28418-Dec-200721:05Niet van toepassing
Normnfkc.nlpNiet van toepassing66,38418-Dec-200721:05Niet van toepassing
Normnfkd.nlpNiet van toepassing60,29418-Dec-200721:05Niet van toepassing
Prc.nlpNiet van toepassing83,74818-Dec-200721:05Niet van toepassing
Prcp.nlpNiet van toepassing83,74818-Dec-200721:05Niet van toepassing
Sortkey.nlpNiet van toepassing262,14818-Dec-200721:05Niet van toepassing
Sorttbls.nlpNiet van toepassing20,32018-Dec-200721:05Niet van toepassing
Xjis.nlpNiet van toepassing28,28818-Dec-200721:05Niet van toepassing
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 en Windows Server 2008, IA-64-versies
BestandsnaamBestandsversieBestandsgrootteDatumTijdPlatform
Big5.nlpNiet van toepassing66,72818-Dec-200721:06Niet van toepassing
Bopomofo.nlpNiet van toepassing82,17218-Dec-200721:06Niet van toepassing
Ksc.nlpNiet van toepassing116,75618-Dec-200721:06Niet van toepassing
Mscorlib.dll2.0.50727.30684,005,88801-Oct-200822:26IA-64
Normidna.nlpNiet van toepassing59,34218-Dec-200721:08Niet van toepassing
Normnfc.nlpNiet van toepassing45,79418-Dec-200721:08Niet van toepassing
Normnfd.nlpNiet van toepassing39,28418-Dec-200721:08Niet van toepassing
Normnfkc.nlpNiet van toepassing66,38418-Dec-200721:08Niet van toepassing
Normnfkd.nlpNiet van toepassing60,29418-Dec-200721:08Niet van toepassing
Prc.nlpNiet van toepassing83,74818-Dec-200721:08Niet van toepassing
Prcp.nlpNiet van toepassing83,74818-Dec-200721:08Niet van toepassing
Sortkey.nlpNiet van toepassing262,14818-Dec-200721:08Niet van toepassing
Sorttbls.nlpNiet van toepassing20,32018-Dec-200721:08Niet van toepassing
Xjis.nlpNiet van toepassing28,28818-Dec-200721:08Niet van toepassing
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.nlpNiet van toepassing66,72818-Dec-200721:03Niet van toepassing
Bopomofo.nlpNiet van toepassing82,17218-Dec-200721:03Niet van toepassing
Ksc.nlpNiet van toepassing116,75618-Dec-200721:04Niet van toepassing
Mscorlib.dll2.0.50727.30684,546,56001-Oct-200822:27x86
Normidna.nlpNiet van toepassing59,34218-Dec-200721:05Niet van toepassing
Normnfc.nlpNiet van toepassing45,79418-Dec-200721:05Niet van toepassing
Normnfd.nlpNiet van toepassing39,28418-Dec-200721:05Niet van toepassing
Normnfkc.nlpNiet van toepassing66,38418-Dec-200721:05Niet van toepassing
Normnfkd.nlpNiet van toepassing60,29418-Dec-200721:05Niet van toepassing
Prc.nlpNiet van toepassing83,74818-Dec-200721:05Niet van toepassing
Prcp.nlpNiet van toepassing83,74818-Dec-200721:05Niet van toepassing
Sortkey.nlpNiet van toepassing262,14818-Dec-200721:05Niet van toepassing
Sorttbls.nlpNiet van toepassing20,32018-Dec-200721:05Niet van toepassing
Xjis.nlpNiet van toepassing28,28818-Dec-200721:05Niet van toepassing
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

Tijdelijke oplossing


Gebruik een van de volgende methoden om dit probleem omzeilen.

Methode 1

Als de toepassingscode lijkt op het voorbeeld met programmacode in de sectie 'Meer informatie', zoek de volgende regel code.
#define GETVECTOR3D(vec3d) (*reinterpret_cast<AcGeVector3d*>(&((vec3d).m_x))
Als u deze regel als volgt te wijzigen.
#define GETVECTOR3D(vec3d) (*reinterpret_cast<AcGeVector3d*>(&((vec3d)))

Methode 2

Implementeer een ini-bestand. Hiertoe maakt u een bestand met de volgende code.
[.NET Framework Debugging Control]AllowOptimize=0

Het ini-bestand de naam hetzelfde als de module problematisch, maar met de extensie INI-in plaats van de extensie .dll. Bijvoorbeeld de voorbeeldcode in het gedeelte 'Meer informatie' noemen het ini-bestand het bestand Bug.ini. Plaats het bestand Bug.ini in dezelfde map als het bestand Bug.dll.

Opmerking Het nadeel van deze methode is het potentiële effect van geen optimalisatie. Deze methode is niet van toepassing als u de Native Image Generator (Ngen.exe) met de module voorcompileren.

Methode 3

De optie NoOptimization van de MethodImplOptions -opsomming aan de problematische methoden selectief toepassen met behulp van de klasse MethodImplAttribute .

Opmerking Deze methode schakelt de optimalisaties voor de JIT-compiler en de Native Image Generator (Ngen.exe) op een niveau per methode. Mate waarin de prestaties worden beïnvloed is afhankelijk van de methode.

Status


Microsoft heeft bevestigd dat dit probleem kan optreden in de Microsoft-producten die worden vermeld in de sectie 'Van toepassing op'.

Meer informatie


Stappen om het probleem te reproduceren

  1. Maak een C++-toepassing die is gebaseerd op .NET Framework 3.5 SP1.
  2. .Cpp-bestand toevoegen aan het project, het bestand Bug.cpp het bestand de naam en plak de volgende code in het bestand 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. Het bestand Bug.cpp compileren, moet u de volgende opdracht uitvoeren:
    cl /clr /GL /O2 bug.cpp /link-bestand /out:bug.dll
  4. Maak een nieuw Microsoft Visual C#-project moet worden gebruikt als de client-project.
  5. Naam van het codebestand het Test.cs-bestand en plak de volgende code in het bestand 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. Het bestand Test.cs compileren, moet u de volgende opdracht uitvoeren:
    csc /r:bug.dll test.cs
  7. Als u wilt het manifest in het Test.exe-bestand insluit, kunt u de volgende opdracht uitvoeren:
    MT.exe - nologo-manifest van de bug.dll.manifest-outputresource:test.exe;1
  8. Voer het bestand Test.exe.
U ziet het werkelijke resultaat is als volgt:
1.33333333333333, 1.333333333333, 0
De verwachting is echter als volgt:
1.33333333333333, 0, 0

Referenties


Voor meer informatie over terminologie voor software-updates klikt u op het volgende artikelnummer om het artikel in de Microsoft Knowledge Base weer te geven:
824684 beschrijving van de standaardterminologie die wordt gebruikt om software-updates voor Microsoft te beschrijven