4

今天我遇到了一个非常奇怪的问题,我能够解决,但我仍然不明白为什么会这样。这是场景:

编辑

我将场景更改为更简单:我有一个执行代码的程序和 2 个导入器,一个具有泛型类型的基类和另一个仅调用基方法并对其进行迭代的类 (ImplementingImporter)。这是完整的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IEnumeratorLoadProblem {
    class Program {
        static void Main(string[] args) {

            var importer = new ImplementingImporter();
            try {
                var data = importer.GetData().ToArray();
            } catch (BadImageFormatException ex) {                
                Console.WriteLine("Why does this fail? " + ex.ToString());
            }

            Console.WriteLine("Press enter to quit");
            Console.ReadLine();
        }
    }

    class BaseClassImporter<T> {

        public virtual IEnumerable<T> GetData() {
            yield break;
        }
    }

    class ImplementingImporter : BaseClassImporter<int> {
        public override IEnumerable<int> GetData() {
            // iterating seems to cause the problem
            foreach(var dataByBaseImpl in base.GetData()) {
                yield return dataByBaseImpl;
            }
        }
    }
}

我收到以下错误:

System.BadImageFormatException:试图加载格式不正确的程序。(来自 HRESULT 的异常:0x8007000B)

当我将代码从使用过的导入器更改为它

class ImplementingImporter : BaseClassImporter<int> {
    protected override IEnumerable<int> GetData() {
        return base.GetData();
    }
}

不幸的是,我无法查看生成的 IL 代码,因为 ILSpy 和 Reflector.NET(版本 6)都显示了一个内部错误(我认为这是一个 ArgumentOutOfRangeException)。我害怕使用 ildasm,所以没有尝试直接看 IL Code。

我想这与生成的 IL 代码有关,但我想不出导致问题的场景。

有什么想法吗?如果场景不够清楚,请发表评论,我会尽量让它更清楚。

编辑:

使用的 .NET 版本:4.0。该应用程序是使用 VS 2010 SP1 的 ConsoleApplication。构建平台目标是 AnyCPu,但使用 x86 时也会出现问题。我的机器有一个 64 位系统(Windows 7)。使用 .NET 4.0 客户端配置文件时也会发生异常。

该示例是单个项目,没有使用外部/非托管库,因此不应出现建议的问题(例如,在运行 64 位时引用 32 位程序集)。

4

2 回答 2

4

这似乎是yield return语句的一个错误:

https://connect.microsoft.com/VisualStudio/feedback/details/677532/an-attempt-was-made-to-load-a-program-with-an-incorrect-format-exception-from-hresult-0x8007000b#细节

他们声明它已在 VS2012(或“VS 2010 之后的版本”)中修复。

我正在使用 VS2010 SP1 运行针对 .NET Framework 4 的控制台应用程序,并且可以确认我得到了与您相同的错误。我没有可用于尝试的 VS2012 安装。

这里提出了一个类似的问题:

迭代器块和继承

另一个可疑的类似示例(这次是异步,但MoveNext再次触发):

C#5 AsyncCtp BadImageFormatException

其他资源:

于 2012-08-14T14:09:45.917 回答
0

确保所有项目都使用相同的编译选项(AnyCPU、x86 或 x64)。

如果您使用任何外部 dll,请确保它们兼容(即 x86 机器上为 32 位,x64 机器上为 64 位)。

如果你想在 x64 机器上使用 32 位 dll,那么你需要将你的 main .exe 设置为编译为“x86”而不是“任何 CPU”——这将强制整个应用程序作为 32 位进程运行在 64 位 PC 上。(如果您不这样做,您的 exe 将在 x64 机器上被 JIT 编译为 64 位应用程序,然后尝试调用您的 32 位 dll,这将引发您得到的异常)

于 2012-08-14T13:26:48.103 回答