C# 切换“首选32位”时,64位操作系统上接口和泛型的奇怪调试器行为

C# 切换“首选32位”时,64位操作系统上接口和泛型的奇怪调试器行为,c#,generics,.net-4.5,anycpu,C#,Generics,.net 4.5,Anycpu,我遇到了这种奇怪的行为:当我的项目设置设置为任何CPU,并且在64位Windows 7操作系统上更喜欢32位时,下面的.Net 4.5程序就如预期的那样工作。但是,如果我关闭了Prefer32-bit,那么在逐步执行程序时,我可以看到代码从未进入接口实现,但也不会抛出任何错误 我已在以下控制台应用程序中将其提炼为最简单的形式: namespace BugCheck { interface IBroken { bool Broken<TValue> (T

我遇到了这种奇怪的行为:当我的项目设置设置为任何CPU,并且在64位Windows 7操作系统上更喜欢32位时,下面的.Net 4.5程序就如预期的那样工作。但是,如果我关闭了Prefer32-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());
        }
    }
}
正如预期的那样,当切换“首选32位”时,程序将在.net 32位程序集和64位程序集之间交替运行,在32位程序集上它将按预期工作,而在64位程序集上它将以静默方式中断

正如@Athari所建议的,它似乎与大型结构的大小有关


我做错了什么导致了这种行为?

对于那些遇到这个问题寻求解决方案的人,请引用:

这似乎与.NET Framework 4.5.2中修复的错误有关。我们可以通过禁用托管返回值功能来验证问题是否相关。我已经在“变通办法”部分发布了这样做的说明

此问题是由收集返回值的代码引起的。它是 可以通过禁用托管返回值来解决此问题

转到系统属性Win8:WinKey+X,选择“系统”,Win7:从我的计算机打开“属性” 高级系统设置 环境变量… 单击“新建”并添加 名称:VSDebug_DisableManagedReturnValue 价值:1 如果禁用托管返回值可以解决此问题,则 此问题在.NET Framework 4.5.2中。这可以从 . 安装4.5.2是修复该问题所需的全部内容


简化示例:实例字段、参数数量和时间跨度无关紧要。参数的总大小可以通过添加/移除结构域来调整我的示例中的大小,它可能改变参数是如何通过的。边注:考虑编辑标题,或者添加引号,喜欢32位或改写,因此它看起来不象是想要一些奇特的32位行为……在64位操作系统上切换“首选32位”Athari+Alexei时,界面和泛型可能会出现奇怪的调试器行为-谢谢,进行了相应的编辑。在我看来,这是一个4.0调试器错误,2.0调试器没有问题。这里的任何人都无法为您解决任何问题,请在connect.microsoft报告此问题。com@HansPassant谢谢,我将遵循这条路线-我只是想确保我没有落入假设它是一个bug的陷阱,如果这个bug只是我的无知:我似乎很难通过浏览器登录,所以在VS中使用了集成反馈,所以可能登录到了错误的位置