Подтвердить что ты не робот

Нечетное поведение отладчика с интерфейсом и дженериками на 64-битной ОС при переключении "Предпочитайте 32-битный

Я столкнулся с этим странным поведением: когда настройки моих проектов установлены на Any CPU и Prefer 32-bit на 64bit Windows 7 OS, программа .Net 4.5 работает как ожидалось. Если, однако, я отключу Prefer 32-bit, а затем, пройдя по программе, я вижу, что код никогда не вступает в реализацию интерфейса, но также не вызывает никаких ошибок.

Я переделал его в самую простую форму в следующем консольном приложении:

namespace BugCheck
{
    interface IBroken
    {
        bool Broken<TValue> (TValue gen, Large large);
    }
    class Broke : IBroken
    {
        public bool Broken<TValue> (TValue gen, Large large )
        { return true; }
    }
    struct Large
    {
        int a, b, c;
    }
    class Program
    {
        static void Main (string[] args)
        {
            //32bit can step in. 64bit can't
            ((IBroken)new Broke()).Broken(1, new Large());
        }
    }
}

Как и ожидалось, при переключении Prefer 32-bit программа будет чередоваться между 32-разрядными сборками .net и 64-битными ассемблерами - там, где она работает, как ожидается, с 32-битными ассемблиями и "разрывается тихо" с 64-битными ассемблиями.

Как было предложено @Athari, оно, по-видимому, связано с размером большой структуры.

Что я делаю неправильно, что вызывает это поведение?

4b9b3361

Ответ 1

Для тех, кто сталкивается с этим вопросом, ища решение, процитируйте Tom из команды Microsoft:

Похоже, что это связано с ошибкой, которая исправлена ​​в .NET Framework 4.5.2. Мы можем убедиться, что проблема связана с отключением функции управляемого возвращаемого значения. Я разместил инструкции для этого в разделе "Обходные пути".

Эта проблема вызвана кодом, который собирает возвращаемые значения. это можно обойти проблему, отключив управляемые возвращаемые значения.

  • Перейдите к свойствам системы (Win8: WinKey + X, выберите "Система, Win7: Открыть" Свойства с моего компьютера)
  • Расширенные настройки системы
  • Переменные среды...
  • Нажмите "Создать" и добавьте
    • Имя: VSDebug_DisableManagedReturnValue
    • Значение: 1

Если отключить управляемые возвращаемые значения вокруг проблемы, исправление для эта проблема находится в .NET Framework 4.5.2. Это можно загрузить из http://www.microsoft.com/en-us/download/details.aspx?id=42642. Установка 4.5.2 - это все, что необходимо для устранения проблемы.