ИСПРАВИТЬ: На компьютере, на котором работает платформа.NET Framework 3.5 Пакет обновления 1, Native Image Generator (Ngen.exe), используйте файл Mscorjit.dll и JIT-компилятор может создать неправильный код

Симптомы

На компьютере, на котором выполняется Microsoft платформа.NET Framework 3.5 Пакет обновления 1 (SP1) Native Image Generator (Ngen.exe), используйте файл Mscorjit.dll и just-in-time (JIT) компилятор может создать неправильный код. Таким образом 32-разрядное приложение управляемого C++ может привести к неверным результатам.

Эта проблема возникает, если выполняются следующие условия:
  • В исходном коде класса или структуры имеет меньше четырех видов скалярных и нет ссылки на управляемый объект.
  • Используется инструкция Cpblk или инструкция Initblk.
Примечание. Эта проблема не возникает в 64-разрядных приложениях.

Причина

Эта проблема возникает из-за регрессии в платформа.NET Framework 3.5 SP1.

Решение

Сведения об исправлении

Существует исправление от корпорации Майкрософт. Однако данное исправление предназначено для устранения только проблемы, описанной в этой статье. Применяйте данное исправление только в тех системах, которые имеют данную проблему. Это исправление может проходить дополнительное тестирование. Таким образом если вы не подвержены серьезно этой проблеме, рекомендуется дождаться следующего пакета обновления, содержащего это исправление.

Чтобы загрузить это исправление из коллекции кода MSDN, посетите следующий веб-узел корпорации Майкрософт:


Примечание. Коллекции кода MSDN отображаются языки, для которых доступно исправление. Если в списке язык не отображается, это недоступности страница коллекции кода для этого языка.


Примечание. Если наблюдаются другие проблемы или необходимо устранить неполадки, вам может понадобиться создать отдельный запрос на обслуживание. Стандартная оплата за поддержку будет взиматься только за дополнительные вопросы и проблемы, которые не соответствуют требованиям конкретного исправления. Чтобы получить полный список телефонов поддержки и обслуживания клиентов корпорации Майкрософт или создать отдельный запрос на обслуживание, посетите следующий веб-сайт корпорации Майкрософт:

Примечание. Если 32-разрядные приложения, которое выполняется на 64-разрядной платформе, исправление для 64-разрядной версии для решения этой проблемы.

Предварительные условия

Платформа.NET Framework 3.5 с пакетом обновления 1 для установки этого исправления необходимо иметь.

Необходимость перезагрузки

Может потребоваться перезагрузить компьютер, если используются любые файлы, которые будут обновлены.

Сведения о замене исправлений

Это исправление не заменяет других исправлений.

Сведения о файлах

Английская версия данного исправления содержит атрибуты файла (или более поздние атрибуты файлов), приведенные в следующей таблице. Дата и время для этих файлов указаны в формате общего скоординированного времени (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
Пакет обновления 1 (SP1) для Windows Vista и Windows Server 2008 x 86 версии
Имя файлаВерсия файлаРазмер файлаДатаВремяПлатформа
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
Пакет обновления 1 для Windows Vista и 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
Пакет обновления 1 для Windows Vista и 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.

Примечание. Недостатком этого метода является возможный эффект производительности для оптимизация. Если вы используете Native Image Generator (Ngen.exe) для предварительной компиляции модуля, этот метод не применяется.

Способ 3

Выборочно примените параметр NoOptimization перечисления MethodImplOptions проблемных методов с помощью класса атрибута MethodImplAttribute .

Примечание. Этот метод отключает оптимизацию JIT-компилятором, а Native Image Generator (Ngen.exe), на уровне каждого метода. Насколько это влияет на производительность зависит от метода.

Статус

Корпорация Майкрософт подтверждает, что это проблема продуктов Майкрософт, перечисленных в разделе "Относится к".

Дополнительные сведения

Действия по воспроизведению проблемы

  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

Ссылки

Для получения дополнительных сведений о терминологии обновлений программного обеспечения щелкните следующий номер статьи базы знаний Майкрософт:
Описание 824684 Стандартные термины, используемые при описании обновлений программных продуктов Майкрософт
Свойства

Номер статьи: 957542 — последний просмотр: 23 февр. 2017 г. — редакция: 1

Microsoft .NET Framework 3.5 Service Pack 1

Отзывы и предложения