编辑
我改变了场景让它更加简单:我有一个执行代码的程序和两个导入器,一个带有通用类型的基类和另一个类(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代码。
我猜想这与生成的IL代码有关,但我无法想象造成问题的情况。
有什么想法吗?如果情况不够清楚,请留下评论,我会尝试让它更清晰。
编辑:使用的.NET版本为4.0。应用程序是使用VS 2010 SP1创建的控制台应用程序。构建平台目标是AnyCPu,但使用x86时也出现了问题。我的机器是64位系统(Windows 7)。即使使用.NET 4.0客户端配置文件,异常也会发生。
示例是单个项目,未使用外部/非托管库,因此只应该出现建议的问题(例如在运行64位时引用32位程序集)。