20

我遇到了这种奇怪的行为:当我的项目设置设置为Any CPUPrefer 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程序时,将在 .net 32​​ 位程序集和 64 位程序集之间交替 - 它与 32 位程序集按预期工作,并与 64 位程序集“静默中断”。

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

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

4

1 回答 1

1

对于那些遇到此问题并寻找解决方案的人,请引用Microsoft 团队的 Tom 的话:

这看起来与 .NET Framework 4.5.2 中修复的错误有关。我们可以通过禁用托管返回值功能来验证问题是否相关。我已将执行此操作的说明发布到“解决方法”部分。

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

  1. 转到系统属性(Win8:WinKey+X,选择“系统”,Win7:从我的电脑打开“属性”)
  2. 高级系统设置
  3. 环境变量...</li>
  4. 点击“新建”并添加
    • 名称:VSDebug_DisableManagedReturnValue
    • 值:1

如果禁用托管返回值可以解决此问题,则此问题的修复程序位于 .NET Framework 4.5.2 中。这可以从 http://www.microsoft.com/en-us/download/details.aspx?id=42642下载。安装 4.5.2 即可解决此问题。

于 2014-08-22T01:08:26.943 回答