FIX: 在執行.NET Framework 3.5 Service Pack 1 電腦上 JIT 編譯器,原生 [映像產生器 (Ngen.exe) 使用 Mscorjit.dll 檔案可能會產生不正確的程式碼

文章翻譯 文章翻譯
文章編號: 957542 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

正在執行 Microsoft.NET Framework 3.5 Service Pack 1 (SP1) 電腦上只的時間 (JIT) 編譯器和原生 [映像產生器 (Ngen.exe) 使用 Mscorjit.dll 檔案可能會產生不正確的程式碼。因此,32 位元受管理的 C + + 應用程式可能會產生不正確的結果。

如果下列情況成立,就會發生這個問題:
  • 結構或原始程式碼中的類別有四個純量的種類和沒有 Managed 的物件參考小於。
  • 您可以使用 Cpblk 指令或 Initblk 指令。
附註在 64 位元應用程式中,不會發生這個問題。

發生的原因

之所以發生這個問題,因為是在.NET Framework 3.5 SP1 的迴歸。

解決方案

Hotfix 資訊

Microsoft 提供支援的 Hotfix。不過,此 Hotfix 旨在修正本文中所述隨問題。只會發生此特定問題的系統套用此 Hotfix。這個 Hotfix 可能會接受額外的測試。因此,如果您不會嚴重影響這個問題,我們建議您等候下一個包含此 Hotfix 的軟體更新。

如果要下載此 Hotfix 從 MSDN 程式碼庫,請造訪下列 Microsoft 網站]:
http://code.msdn.microsoft.com/KB957542

附註[MSDN 程式碼庫會顯示此 Hotfix 會出現,以供使用的語言。如果您看不到您所列出的語言,它是因為代碼庫資源頁面未提供該語言的支援。

附註如果發生其他問題,或如果需要任何疑難排解,您可能必須建立個別的服務要求。和此 Hotfix 無關的額外支援問題適用一般的支援費用。如需 Microsoft 客戶服務支援部門電話號碼的完整清單或要建立個別的服務要求,請造訪下列 Microsoft 網站:
http://support.microsoft.com/contactus/?ws=support
附註如果您是在 64 位元平台執行的 32 位元應用程式適用 64 位元版本,如果要解決這個問題的 Hotfix。

必要條件

您必須有安裝若要套用此 Hotfix 的.NET Framework 3.5 SP1。

重新啟動需求

您可能必須重新啟動電腦,如果正在使用的任何更新的檔案。

Hotfix 取代資訊

此 Hotfix 不會取代任何其他的 Hotfix。

檔案資訊

此 Hotfix 的英文版在檔案屬性 (或更新版本的檔案屬性) 如下列表格中所列。這些檔案的日期和時間為 Coordinated Universal Time (UTC)。當您檢視檔案資訊時,會將它轉換為當地時間。若要到 UTC 與當地時間差異使用在 [日期及時間 中項目控制台中的 [時區] 索引標籤]。
Windows 2000、 Windows XP 和 Windows Server 2003 x 86 版本
摺疊此表格展開此表格
檔案名稱檔案版本檔案大小日期時間
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 和 Windows Server 2003 x 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.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) 和 Windows Server 2008 x 86 版本
摺疊此表格展開此表格
檔案名稱檔案版本檔案大小日期時間平台
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,56001-Oct-200822: 27x86
Normidna.nlp不適用59,3422007 年十二月 18 日21: 05不適用
Normnfc.nlp不適用45,7942007 年十二月 18 日21: 05不適用
Normnfd.nlp不適用39,2842007 年十二月 18 日21: 05不適用
Normnfkc.nlp不適用66,3842007 年十二月 18 日21: 05不適用
Normnfkd.nlp不適用60,2942007 年十二月 18 日21: 05不適用
Prc.nlp不適用83,7482007 年十二月 18 日21: 05不適用
Prcp.nlp不適用83,7482007 年十二月 18 日21: 05不適用
Sortkey.nlp不適用262,1482007 年十二月 18 日21: 05不適用
Sorttbls.nlp不適用20,3202007 年十二月 18 日21: 05不適用
Xjis.nlp不適用28,2882007 年十二月 18 日21: 05不適用
Mscordacwks.dll2.0.50727.3068992,26401-Oct-200822: 27x86
Mscorjit.dll2.0.50727.3068367,1042008 年九月 24 日22: 21x86
Mscorwks.dll2.0.50727.30685,815,80801-Oct-200822: 27x86
Windows Vista SP1 和 Windows Server 2008 x 64 版本
摺疊此表格展開此表格
檔案名稱檔案版本檔案大小日期時間平台
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,94401-Oct-200822: 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,94401-Oct-200822: 25x64
Mscorjit.dll2.0.50727.30681,580,0322008 年九月 24 日23: 06x64
Mscorwks.dll2.0.50727.306810,079,74401-Oct-200822: 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,56001-Oct-200822: 27x86
Normidna.nlp不適用59,3422007 年十二月 18 日21: 05不適用
Normnfc.nlp不適用45,7942007 年十二月 18 日21: 05不適用
Normnfd.nlp不適用39,2842007 年十二月 18 日21: 05不適用
Normnfkc.nlp不適用66,3842007 年十二月 18 日21: 05不適用
Normnfkd.nlp不適用60,2942007 年十二月 18 日21: 05不適用
Prc.nlp不適用83,7482007 年十二月 18 日21: 05不適用
Prcp.nlp不適用83,7482007 年十二月 18 日21: 05不適用
Sortkey.nlp不適用262,1482007 年十二月 18 日21: 05不適用
Sorttbls.nlp不適用20,3202007 年十二月 18 日21: 05不適用
Xjis.nlp不適用28,2882007 年十二月 18 日21: 05不適用
Mscordacwks.dll2.0.50727.3068992,26401-Oct-200822: 27x86
Mscorjit.dll2.0.50727.3068367,1042008 年九月 24 日22: 21x86
Mscorwks.dll2.0.50727.30685,815,80801-Oct-200822: 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,88801-Oct-200822: 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,88001-Oct-200822: 26IA 64
Mscorjit.dll2.0.50727.30682,560,5122008 年九月 24 日23: 14IA 64
Mscorwks.dll2.0.50727.306820,153,85601-Oct-200822: 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,56001-Oct-200822: 27x86
Normidna.nlp不適用59,3422007 年十二月 18 日21: 05不適用
Normnfc.nlp不適用45,7942007 年十二月 18 日21: 05不適用
Normnfd.nlp不適用39,2842007 年十二月 18 日21: 05不適用
Normnfkc.nlp不適用66,3842007 年十二月 18 日21: 05不適用
Normnfkd.nlp不適用60,2942007 年十二月 18 日21: 05不適用
Prc.nlp不適用83,7482007 年十二月 18 日21: 05不適用
Prcp.nlp不適用83,7482007 年十二月 18 日21: 05不適用
Sortkey.nlp不適用262,1482007 年十二月 18 日21: 05不適用
Sorttbls.nlp不適用20,3202007 年十二月 18 日21: 05不適用
Xjis.nlp不適用28,2882007 年十二月 18 日21: 05不適用
Mscordacwks.dll2.0.50727.3068992,26401-Oct-200822: 27x86
Mscorjit.dll2.0.50727.3068367,1042008 年九月 24 日22: 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

選擇性地將 MethodImplOptions 列舉型別的 [NoOptimization 選項套用至有問題的方法使用 MethodImplAttribute 類別。

附註這個方法會停用最佳化 JIT 編譯器,以及原生映像產生器 (Ngen.exe) 每個方法層級上。效能的影響多少有所不同,方法。

狀況說明

Microsoft 已確認<適用於>一節所列之 Microsoft 產品確實有此問題。

其他相關資訊

如果要重現問題的步驟

  1. 建立 C + + 應用程式為基礎的.NET Framework 3.5 SP1。
  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
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本: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