Нечетное поведение отладчика с интерфейсом и обобщением на 64-битной ОС при переключении 'Prefer 32-Bit

Я столкнулся с таким странным поведением: когда мои проекты настроены на 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, похоже, что это связано с размером структуры Large.

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам