FIX: 在运行.net Framework 3.5 Service Pack 1 的计算机,JIT 编译器和使用 Mscorjit.dll 文件在本机图像生成器 (Ngen.exe) 可能生成不正确的代码

文章翻译 文章翻译
文章编号: 957542 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

症状

在运行 Microsoft.net 框架 3.5 服务包 1 (SP1) 的计算机,在实时 (JIT) 编译器和使用 Mscorjit.dll 文件在本机图像生成器 (Ngen.exe) 可能会产生不正确的代码。因此,32-位 c + + 托管应用程序可能会产生不正确的结果。

如果满足下列条件都为真,就会出现此问题:
  • 该结构或类在源代码中的少于四个标量种类和没有托管的对象的引用。
  • 您可以使用 Cpblk 指令或 Initblk 指令。
注意在 64 位应用程序中不会发生此问题。

原因

出现此问题是由于.net Framework 3.5 SP1 中的回归分析。

解决方案

修补程序信息

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

要下载此修补程序从 MSDN 代码库,请访问下面的 Microsoft 网站:
http://code.msdn.microsoft.com/KB957542

注意MSDN 代码库显示在此修补程序是可用的语言。如果您看不到您列出的语言,它是因为代码库的资源页不可用该语言的。

注意如果出现其他问题,或者如果需要进行任何故障诊断,则您可能不得不创建单独的服务请求。将正常收取支持费用将应用于其他支持问题和不需要进行此特定的修补程序的问题。有关完整列表的 Microsoft 客户服务和支持的电话号码,或创建一个单独的服务请求,请访问下面的 Microsoft 网站:
http://support.microsoft.com/contactus/?ws=support
注意如果您是 32-位应用程序在 64 位平台上运行的应用若要解决此问题在 64 位版本的修补程序。

系统必备组件

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

重新启动要求

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

修补程序替换信息

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

文件信息

此修补程序的英文版具有的文件属性 (或更新的文件属性) 在下表中列出。日期和时间对这些文件列出在协调世界时 (UTC)。当您查看文件信息时,将转换为本地时间。若要 UTC 与本地时间之间的时差使用控制面板中的 日期和时间 项中的 时区 选项卡。
Windows 2000、 Windows XP 和 x 86 版本的 Windows Server 2003
收起该表格展开该表格
文件的名称文件版本文件大小日期时间
Mscordacwks.dll2.0.50727.3068992,2642008 年九月 16 日13: 13
Mscorjit.dll2.0.50727.3068367,1042008 年九月 16 日13: 13
Mscorlib.dll2.0.50727.30684,546,5602008 年九月 16 日13: 13
Mscorwks.dll2.0.50727.30685,815,8082008 年九月 16 日13: 13
Windows 2000、 Windows XP 和 x 64 版本的 Windows Server 2003
收起该表格展开该表格
文件的名称文件版本文件大小日期时间平台
Mscordacwks.dll2.0.50727.3068992,2642008 年九月 16 日13: 13x86
Mscorjit.dll2.0.50727.3068367,1042008 年九月 16 日13: 13x86
Mscorlib.dll2.0.50727.30684,546,5602008 年九月 16 日13: 13x86
Mscorwks.dll2.0.50727.30685,815,8082008 年九月 16 日13: 13x86
Mscordacwks.dll2.0.50727.30681,767,9442008 年九月 16 日10: 33x64
Mscorjit.dll2.0.50727.30681,580,0322008 年九月 16 日10: 33x64
Mscorlib.dll2.0.50727.30684,562,9442008 年九月 16 日10: 33x64
Mscorwks.dll2.0.50727.306810,079,7442008 年九月 16 日10: 33x64
Windows 2000,Windows XP 和 Windows Server 2003,ia-64 版本
收起该表格展开该表格
文件的名称文件版本文件大小日期时间平台
Mscordacwks.dll2.0.50727.3068992,2642008 年九月 16 日13: 13x86
Mscorjit.dll2.0.50727.3068367,1042008 年九月 16 日13: 13x86
Mscorlib.dll2.0.50727.30684,546,5602008 年九月 16 日13: 13x86
Mscorwks.dll2.0.50727.30685,815,8082008 年九月 16 日13: 13x86
Mscordacwks.dll2.0.50727.30683,087,8802008 年九月 16 日10: 44IA 64
Mscorjit.dll2.0.50727.30682,560,5122008 年九月 16 日10: 44IA 64
Mscorlib.dll2.0.50727.30684,005,8882008 年九月 16 日10: 44IA 64
Mscorwks.dll2.0.50727.306820,153,8562008 年九月 16 日10: 44IA 64
Windows Vista Service Pack 1 (SP1) 和 x 86 版本的 Windows Server 2008
收起该表格展开该表格
文件的名称文件版本文件大小日期时间平台
Mscorlib.resources.dll2.0.50727.3053352,2562008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053303,1042008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053299,0082008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053315,3922008 年七月 27 日17: 58x86
Mscorlib.resources.dll2.0.50727.3053425,9842008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053307,2002008 年七月 27 日17: 58x86
Mscorlib.resources.dll2.0.50727.3053299,0082008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053311,2962008 年七月 27 日17: 58x86
Mscorlib.resources.dll2.0.50727.3053331,7762008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053315,3922008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053307,2002008 年七月 27 日17: 55x86
Mscorlib.resources.dll2.0.50727.3053348,1602008 年七月 27 日17: 58x86
Mscorlib.resources.dll2.0.50727.3053319,4882008 年七月 27 日17: 55x86
Mscorlib.resources.dll2.0.50727.3053290,8162008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053303,1042008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053311,2962008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053303,1042008 年七月 27 日17: 55x86
Mscorlib.resources.dll2.0.50727.3053307,2002008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.1434397,3122008 年一月 11 日22: 59x86
Mscorlib.resources.dll2.0.50727.3053299,0082008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053299,0082008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053278,5282008 年七月 27 日17: 55x86
Mscorlib.resources.dll2.0.50727.3053278,5282008 年七月 27 日17: 55x86
Big5.nlp不适用66,7282007 年十二月 18 日21: 03不适用
Bopomofo.nlp不适用82,1722007 年十二月 18 日21: 03不适用
Ksc.nlp不适用116,7562007 年十二月 18 日21: 04不适用
Mscorlib.dll2.0.50727.30684,546,5602008 年十月 1 日22: 27x86
Normidna.nlp不适用59,3422007 年十二月 18 日2005 年 21:不适用
Normnfc.nlp不适用45,7942007 年十二月 18 日2005 年 21:不适用
Normnfd.nlp不适用39,2842007 年十二月 18 日2005 年 21:不适用
Normnfkc.nlp不适用66,3842007 年十二月 18 日2005 年 21:不适用
Normnfkd.nlp不适用60,2942007 年十二月 18 日2005 年 21:不适用
Prc.nlp不适用83,7482007 年十二月 18 日2005 年 21:不适用
Prcp.nlp不适用83,7482007 年十二月 18 日2005 年 21:不适用
Sortkey.nlp不适用262,1482007 年十二月 18 日2005 年 21:不适用
Sorttbls.nlp不适用20,3202007 年十二月 18 日2005 年 21:不适用
Xjis.nlp不适用28,2882007 年十二月 18 日2005 年 21:不适用
Mscordacwks.dll2.0.50727.3068992,2642008 年十月 1 日22: 27x86
Mscorjit.dll2.0.50727.3068367,1042008 年九月 24 日22: 21x86
Mscorwks.dll2.0.50727.30685,815,8082008 年十月 1 日22: 27x86
Windows Vista SP1 和 x 64 版本的 Windows Server 2008
收起该表格展开该表格
文件的名称文件版本文件大小日期时间平台
Big5.nlp不适用66,7282007 年十二月 18 日21: 01不适用
Bopomofo.nlp不适用82,1722007 年十二月 18 日21: 01不适用
Ksc.nlp不适用116,7562007 年十二月 18 日21: 02不适用
Mscorlib.dll2.0.50727.30684,562,9442008 年十月 1 日22: 25x64
Normidna.nlp不适用59,3422007 年十二月 18 日21: 03不适用
Normnfc.nlp不适用45,7942007 年十二月 18 日21: 03不适用
Normnfd.nlp不适用39,2842007 年十二月 18 日21: 03不适用
Normnfkc.nlp不适用66,3842007 年十二月 18 日21: 03不适用
Normnfkd.nlp不适用60,2942007 年十二月 18 日21: 03不适用
Prc.nlp不适用83,7482007 年十二月 18 日21: 03不适用
Prcp.nlp不适用83,7482007 年十二月 18 日21: 03不适用
Sortkey.nlp不适用262,1482007 年十二月 18 日21: 03不适用
Sorttbls.nlp不适用20,3202007 年十二月 18 日21: 03不适用
Xjis.nlp不适用28,2882007 年十二月 18 日21: 03不适用
Mscordacwks.dll2.0.50727.30681,767,9442008 年十月 1 日22: 25x64
Mscorjit.dll2.0.50727.30681,580,0322008 年九月 24 日23: 06x64
Mscorwks.dll2.0.50727.306810,079,7442008 年十月 1 日22: 25x64
Mscorlib.resources.dll2.0.50727.3053352,2562008 年九月 15 日22: 26x86
Mscorlib.resources.dll2.0.50727.3053303,1042008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053299,0082008 年九月 15 日22: 26x86
Mscorlib.resources.dll2.0.50727.3053315,3922008 年七月 27 日18: 02x86
Mscorlib.resources.dll2.0.50727.3053425,9842008 年九月 15 日22: 26x86
Mscorlib.resources.dll2.0.50727.3053307,2002008 年七月 27 日18: 02x86
Mscorlib.resources.dll2.0.50727.3053299,0082008 年九月 15 日22: 26x86
Mscorlib.resources.dll2.0.50727.3053311,2962008 年七月 27 日18: 02x86
Mscorlib.resources.dll2.0.50727.3053331,7762008 年九月 15 日22: 26x86
Mscorlib.resources.dll2.0.50727.3053315,3922008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053307,2002008 年七月 27 日17: 56x86
Mscorlib.resources.dll2.0.50727.3053348,1602008 年七月 27 日18: 02x86
Mscorlib.resources.dll2.0.50727.3053319,4882008 年七月 27 日17: 56x86
Mscorlib.resources.dll2.0.50727.3053290,8162008 年九月 15 日22: 26x86
Mscorlib.resources.dll2.0.50727.3053303,1042008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053311,2962008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053303,1042008 年七月 27 日17: 56x86
Mscorlib.resources.dll2.0.50727.3053307,2002008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.1434397,3122008 年一月 11 日22: 59x86
Mscorlib.resources.dll2.0.50727.3053299,0082008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053299,0082008 年九月 15 日22: 25x86
Mscorlib.resources.dll2.0.50727.3053278,5282008 年七月 27 日17: 56x86
Mscorlib.resources.dll2.0.50727.3053278,5282008 年七月 27 日17: 56x86
Big5.nlp不适用66,7282007 年十二月 18 日21: 03不适用
Bopomofo.nlp不适用82,1722007 年十二月 18 日21: 03不适用
Ksc.nlp不适用116,7562007 年十二月 18 日21: 04不适用
Mscorlib.dll2.0.50727.30684,546,5602008 年十月 1 日22: 27x86
Normidna.nlp不适用59,3422007 年十二月 18 日2005 年 21:不适用
Normnfc.nlp不适用45,7942007 年十二月 18 日2005 年 21:不适用
Normnfd.nlp不适用39,2842007 年十二月 18 日2005 年 21:不适用
Normnfkc.nlp不适用66,3842007 年十二月 18 日2005 年 21:不适用
Normnfkd.nlp不适用60,2942007 年十二月 18 日2005 年 21:不适用
Prc.nlp不适用83,7482007 年十二月 18 日2005 年 21:不适用
Prcp.nlp不适用83,7482007 年十二月 18 日2005 年 21:不适用
Sortkey.nlp不适用262,1482007 年十二月 18 日2005 年 21:不适用
Sorttbls.nlp不适用20,3202007 年十二月 18 日2005 年 21:不适用
Xjis.nlp不适用28,2882007 年十二月 18 日2005 年 21:不适用
Mscordacwks.dll2.0.50727.3068992,2642008 年十月 1 日22: 27x86
Mscorjit.dll2.0.50727.3068367,1042008 年九月 24 日22: 21x86
Mscorwks.dll2.0.50727.30685,815,8082008 年十月 1 日22: 27x86
Windows Vista SP1 和 Windows Server 2008,ia-64 版本
收起该表格展开该表格
文件的名称文件版本文件大小日期时间平台
Big5.nlp不适用66,7282007 年十二月 18 日21: 06不适用
Bopomofo.nlp不适用82,1722007 年十二月 18 日21: 06不适用
Ksc.nlp不适用116,7562007 年十二月 18 日21: 06不适用
Mscorlib.dll2.0.50727.30684,005,8882008 年十月 1 日22: 26IA 64
Normidna.nlp不适用59,3422007 年十二月 18 日21: 08不适用
Normnfc.nlp不适用45,7942007 年十二月 18 日21: 08不适用
Normnfd.nlp不适用39,2842007 年十二月 18 日21: 08不适用
Normnfkc.nlp不适用66,3842007 年十二月 18 日21: 08不适用
Normnfkd.nlp不适用60,2942007 年十二月 18 日21: 08不适用
Prc.nlp不适用83,7482007 年十二月 18 日21: 08不适用
Prcp.nlp不适用83,7482007 年十二月 18 日21: 08不适用
Sortkey.nlp不适用262,1482007 年十二月 18 日21: 08不适用
Sorttbls.nlp不适用20,3202007 年十二月 18 日21: 08不适用
Xjis.nlp不适用28,2882007 年十二月 18 日21: 08不适用
Mscordacwks.dll2.0.50727.30683,087,8802008 年十月 1 日22: 26IA 64
Mscorjit.dll2.0.50727.30682,560,5122008 年九月 24 日23: 14IA 64
Mscorwks.dll2.0.50727.306820,153,8562008 年十月 1 日22: 26IA 64
Mscorlib.resources.dll2.0.50727.3053315,3922008 年七月 27 日17: 58x86
Mscorlib.resources.dll2.0.50727.3053311,2962008 年七月 27 日17: 58x86
Mscorlib.resources.dll2.0.50727.3053348,1602008 年七月 27 日17: 58x86
Mscorlib.resources.dll2.0.50727.3053319,4882008 年七月 27 日17: 58x86
Mscorlib.resources.dll2.0.50727.3053278,5282008 年七月 27 日17: 58x86
Mscorlib.resources.dll2.0.50727.3053278,5282008 年七月 27 日17: 59x86
Big5.nlp不适用66,7282007 年十二月 18 日21: 03不适用
Bopomofo.nlp不适用82,1722007 年十二月 18 日21: 03不适用
Ksc.nlp不适用116,7562007 年十二月 18 日21: 04不适用
Mscorlib.dll2.0.50727.30684,546,5602008 年十月 1 日22: 27x86
Normidna.nlp不适用59,3422007 年十二月 18 日2005 年 21:不适用
Normnfc.nlp不适用45,7942007 年十二月 18 日2005 年 21:不适用
Normnfd.nlp不适用39,2842007 年十二月 18 日2005 年 21:不适用
Normnfkc.nlp不适用66,3842007 年十二月 18 日2005 年 21:不适用
Normnfkd.nlp不适用60,2942007 年十二月 18 日2005 年 21:不适用
Prc.nlp不适用83,7482007 年十二月 18 日2005 年 21:不适用
Prcp.nlp不适用83,7482007 年十二月 18 日2005 年 21:不适用
Sortkey.nlp不适用262,1482007 年十二月 18 日2005 年 21:不适用
Sorttbls.nlp不适用20,3202007 年十二月 18 日2005 年 21:不适用
Xjis.nlp不适用28,2882007 年十二月 18 日2005 年 21:不适用
Mscordacwks.dll2.0.50727.3068992,2642008 年十月 1 日22: 27x86
Mscorjit.dll2.0.50727.3068367,1042008 年九月 24 日22: 21x86
Mscorwks.dll2.0.50727.30685,815,8082008 年十月 1 日22: 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

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

注意此方法禁用优化 JIT 编译器,并为每个方法级别上将本机图像生成器 (Ngen.exe)。影响性能的多少取决,该方法。

状态

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

更多信息

重现此问题的步骤

  1. 创建基于.net 框架 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 知识库中相应的文章:
824684用于描述 Microsoft 软件更新的标准术语的说明

属性

文章编号: 957542 - 最后修改: 2008年10月22日 - 修订: 1.1
这篇文章中的信息适用于:
  • Microsoft .NET Framework 3.5 Service Pack 1
关键字:?
kbmt kbexpertiseadvanced kbfix kbqfe kbhotfixserver KB957542 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 957542
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com