修复︰ 在计算机上正在运行的.NET Framework 3.5 Service Pack 1,JIT 编译器和 Mscorjit.dll 文件使用本机映像生成器 (Ngen.exe) 可能会生成不正确的代码

适用于: .NET Framework 3.5 Service Pack 1

症状


在计算机上运行 Microsoft.NET Framework 3.5 Service Pack 1 (SP1),则在实时 (JIT) 编译器和 Mscorjit.dll 文件使用本机映像生成器 (Ngen.exe) 可能会生成不正确的代码。因此,32 位托管 c + + 应用程序可能会产生不正确的结果。

如果以下条件为 true,将出现此问题:
  • 该结构或类的源代码中有少于四个标量类型和任何托管的对象的引用。
  • 使用 Cpblk 指令或紧接指令。
注意:在 64 位应用程序中不会出现此问题。

原因


出现此问题是由于.NET Framework 3.5 SP1 中回归。

解决方案


修补程序信息

可以从 Microsoft 获得受支持的修复程序。然而,此修补程序仅用于解决本文中描述的问题。仅对出现这一特定问题的系统应用此修补程序。此修补程序可能会接受进一步的测试。因此,如果这个问题没有对您造成严重的影响,我们建议您等待包含此修复程序的下一个软件更新。

若要从 MSDN 代码库中下载此修补程序,请访问下面的 Microsoft Web 站点:


注意:MSDN 代码库显示获取此修复程序的语言。如果看不到列出的语言,这是因为代码库的资源页不可用这种语言。


注意:如果出现其他问题或需要任何故障诊断时,您可能需要创建单独的服务请求。对于不符合此特定的修补程序的其他支持问题和事项将照常收取费用。有关 Microsoft 客户服务和支持电话号码或创建单独的服务请求的完整列表,请访问下面的 Microsoft 网站︰

注意:如果您有在 64 位平台运行的 32 位应用程序时,应用的 64 位版本,若要解决此问题的修补程序。

系统必备组件

您必须具有要应用此修补程序的安装.NET Framework 3.5 SP1。

重启要求

您可能需要重新启动计算机,如果任何更新的文件正在使用。

修补程序替换信息

此修补程序不替换任何其他修补程序。

文件信息

此修复程序的英文版具有的文件属性 (或更新的文件属性)在下表中列出。日期和为这些文件的时间以协调世界时 (UTC) 列出。当您查看文件信息时,它将转换为本地时间。要了解 UTC 与本地时间之间的时差,请使用控制面板中的日期和时间项中的时区选项卡。
Windows 2000、 Windows XP 和 Windows Server 2003,x86 版本
文件名称文件版本文件大小日期时间
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 和 Windows Server 2003,x64 版本
文件名称文件版本文件大小日期时间平台
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 和 Windows Server 2003,IA-64 版本
文件名称文件版本文件大小日期时间平台
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) 和 Windows Server 2008 中,x86 版本
文件名称文件版本文件大小日期时间平台
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.nlp不适用66,72818-Dec-200721:03不适用
Bopomofo.nlp不适用82,17218-Dec-200721:03不适用
Ksc.nlp不适用116,75618-Dec-200721:04不适用
Mscorlib.dll2.0.50727.30684,546,56001-Oct-200822:27x86
Normidna.nlp不适用59,34218-Dec-200721:05不适用
Normnfc.nlp不适用45,79418-Dec-200721:05不适用
Normnfd.nlp不适用39,28418-Dec-200721:05不适用
Normnfkc.nlp不适用66,38418-Dec-200721:05不适用
Normnfkd.nlp不适用60,29418-Dec-200721:05不适用
Prc.nlp不适用83,74818-Dec-200721:05不适用
Prcp.nlp不适用83,74818-Dec-200721:05不适用
Sortkey.nlp不适用262,14818-Dec-200721:05不适用
Sorttbls.nlp不适用20,32018-Dec-200721:05不适用
Xjis.nlp不适用28,28818-Dec-200721:05不适用
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 和 Windows Server 2008 中,x64 版本
文件名称文件版本文件大小日期时间平台
Big5.nlp不适用66,72818-Dec-200721:01不适用
Bopomofo.nlp不适用82,17218-Dec-200721:01不适用
Ksc.nlp不适用116,75618-Dec-200721:02不适用
Mscorlib.dll2.0.50727.30684,562,94401-Oct-200822:25x64
Normidna.nlp不适用59,34218-Dec-200721:03不适用
Normnfc.nlp不适用45,79418-Dec-200721:03不适用
Normnfd.nlp不适用39,28418-Dec-200721:03不适用
Normnfkc.nlp不适用66,38418-Dec-200721:03不适用
Normnfkd.nlp不适用60,29418-Dec-200721:03不适用
Prc.nlp不适用83,74818-Dec-200721:03不适用
Prcp.nlp不适用83,74818-Dec-200721:03不适用
Sortkey.nlp不适用262,14818-Dec-200721:03不适用
Sorttbls.nlp不适用20,32018-Dec-200721:03不适用
Xjis.nlp不适用28,28818-Dec-200721:03不适用
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.nlp不适用66,72818-Dec-200721:03不适用
Bopomofo.nlp不适用82,17218-Dec-200721:03不适用
Ksc.nlp不适用116,75618-Dec-200721:04不适用
Mscorlib.dll2.0.50727.30684,546,56001-Oct-200822:27x86
Normidna.nlp不适用59,34218-Dec-200721:05不适用
Normnfc.nlp不适用45,79418-Dec-200721:05不适用
Normnfd.nlp不适用39,28418-Dec-200721:05不适用
Normnfkc.nlp不适用66,38418-Dec-200721:05不适用
Normnfkd.nlp不适用60,29418-Dec-200721:05不适用
Prc.nlp不适用83,74818-Dec-200721:05不适用
Prcp.nlp不适用83,74818-Dec-200721:05不适用
Sortkey.nlp不适用262,14818-Dec-200721:05不适用
Sorttbls.nlp不适用20,32018-Dec-200721:05不适用
Xjis.nlp不适用28,28818-Dec-200721:05不适用
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 和 Windows Server 2008 中,IA-64 版本
文件名称文件版本文件大小日期时间平台
Big5.nlp不适用66,72818-Dec-200721:06不适用
Bopomofo.nlp不适用82,17218-Dec-200721:06不适用
Ksc.nlp不适用116,75618-Dec-200721:06不适用
Mscorlib.dll2.0.50727.30684,005,88801-Oct-200822:26IA-64
Normidna.nlp不适用59,34218-Dec-200721:08不适用
Normnfc.nlp不适用45,79418-Dec-200721:08不适用
Normnfd.nlp不适用39,28418-Dec-200721:08不适用
Normnfkc.nlp不适用66,38418-Dec-200721:08不适用
Normnfkd.nlp不适用60,29418-Dec-200721:08不适用
Prc.nlp不适用83,74818-Dec-200721:08不适用
Prcp.nlp不适用83,74818-Dec-200721:08不适用
Sortkey.nlp不适用262,14818-Dec-200721:08不适用
Sorttbls.nlp不适用20,32018-Dec-200721:08不适用
Xjis.nlp不适用28,28818-Dec-200721:08不适用
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.nlp不适用66,72818-Dec-200721:03不适用
Bopomofo.nlp不适用82,17218-Dec-200721:03不适用
Ksc.nlp不适用116,75618-Dec-200721:04不适用
Mscorlib.dll2.0.50727.30684,546,56001-Oct-200822:27x86
Normidna.nlp不适用59,34218-Dec-200721:05不适用
Normnfc.nlp不适用45,79418-Dec-200721:05不适用
Normnfd.nlp不适用39,28418-Dec-200721:05不适用
Normnfkc.nlp不适用66,38418-Dec-200721:05不适用
Normnfkd.nlp不适用60,29418-Dec-200721:05不适用
Prc.nlp不适用83,74818-Dec-200721:05不适用
Prcp.nlp不适用83,74818-Dec-200721:05不适用
Sortkey.nlp不适用262,14818-Dec-200721:05不适用
Sorttbls.nlp不适用20,32018-Dec-200721:05不适用
Xjis.nlp不适用28,28818-Dec-200721:05不适用
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

解决方法


若要变通解决此问题,请使用下列方法之一:

方法 1

应用程序代码类似于"更多信息"一节中的示例代码,如果找到下面的代码行。
#define GETVECTOR3D(vec3d) (*reinterpret_cast<AcGeVector3d*>(&((vec3d).m_x))
更改此代码行,如下所示。
#define GETVECTOR3D(vec3d) (*reinterpret_cast<AcGeVector3d*>(&((vec3d)))

方法 2

将部署.ini 文件。若要执行此操作,创建包含以下代码的文件。
[.NET Framework Debugging Control]AllowOptimize=0

有问题的模块中,相同名称的.ini 文件,但使用.ini 扩展名,而不是.dll 扩展名。例如,"详细信息"部分中的示例代码,命名的.ini 文件的 Bug.ini 文件。将 Bug.ini 文件放在 Bug.dll 文件所在的目录。

注意:此方法的缺点是任何优化为潜在的性能影响。如果使用本机映像生成器 (Ngen.exe) 预编译模块时,此方法不适用。

方法 3

通过使用MethodImplAttribute类到有问题的方法中有选择地应用MethodImplOptions枚举的NoOptimization选项。

注意:此方法禁用 JIT 编译器和本机映像生成器 (Ngen.exe) 在每个方法级别上的优化。性能的影响程度各不相同,取决于方法。

状态


Microsoft 已经确认这是“适用于”一节中列出的 Microsoft 产品中的问题。

详细信息


重现问题的步骤

  1. 创建一个基于.NET Framework 3.5 SP1 的 c + + 应用程序。
  2. 将一个.cpp 文件添加到项目,此文件命名为 Bug.cpp 的文件中,然后将下面的代码粘贴在 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. 若要编译的 Bug.cpp 文件,请运行以下命令︰
    cl /clr /GL /O2 bug.cpp /link /dll /out:bug.dll
  4. 创建一个新 Microsoft Visual C# 项目将用作客户端项目。
  5. 命名的 Test.cs 文件,代码文件,然后将下面的代码粘贴在 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. 若要编译的 Test.cs 文件,请运行以下命令︰
    csc /r:bug.dll test.cs
  7. 若要将清单嵌入到 Test.exe 文件中,运行以下命令︰
    mt.exe nologo-清单 bug.dll.manifest-outputresource:test.exe;1
  8. 运行 Test.exe 文件。
请注意,实际结果是,如下所示︰
1.33333333333333,1.333333333333 0
但是,预期的结果是,如下所示︰
1.33333333333333,0 0

参考资料


有关软件更新术语的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
用于描述 Microsoft 软件更新的标准术语的824684说明