64位操作系统中,在切换“优先使用32位”选项时,接口和泛型的调试器表现异常

20
我遇到了一个奇怪的行为:当我的项目设置为 Any CPUPrefer 32-bit,在一个 64位 Windows 7 操作系统 上运行时,下面的 .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());
        }
    }
}

正如预期的那样,当切换到偏好32位时,程序会在.net 32位程序集和64位程序集之间交替 - 在32位程序集中按预期工作,在64位程序集中“默默地崩溃”。

正如@Athari所建议的那样,这似乎与大型结构体的大小有关。

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


10
对我来说,这看起来是4.0版本调试器的错误,2.0版本调试器没有问题。这里没有人可以为你修复,建议在connect.microsoft.com上报告此问题。 - Hans Passant
@HansPassant谢谢,我会按照这个方法来处理 - 只是想确保我不会陷入假设它是一个错误的陷阱中,如果错误只是我的无知 :)我发现通过浏览器登录有些问题,所以退而求其次,在VS中使用了集成反馈(可能登录到了错误的位置)https://connect.microsoft.com/VisualStudio/Feedback/details/943122 - Stephen Bailey
1个回答

1

对于那些寻找解决方案的人,引用微软团队的Tom的话:

这似乎与.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即可解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接