使用IEnumerable和Multi Inheritance时出现BadImageFormatException

时间:2012-08-14 13:18:20

标签: c# generics yield il

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

修改

我将场景更改为更简单: 我有一个执行代码的程序,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)都显示内部错误(我认为它是anArgumentOutOfRangeException)。我害怕使用ildasm,所以我没有尝试直接查看IL代码。

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

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

编辑:

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

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

2 个答案:

答案 0 :(得分: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#details

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

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

这里有一个类似的问题:

Iterator blocks and inheritance

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

C#5 AsyncCtp BadImageFormatException

其他资源:

答案 1 :(得分:0)

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

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

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