Нечетное поведение отладчика с интерфейсом и обобщением на 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. Мы можем убедиться, что проблема связана с отключением функции управляемого возвращаемого значения. Я разместил инструкции для этого в разделе "Временные решения".
Эта проблема вызвана кодом, который собирает возвращаемые значения. Можно обойти проблему, отключив управляемые возвращаемые значения.
- Перейдите в Свойства системы (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 - это все, что нужно для решения проблемы.