今日、解決できた非常に奇妙な問題が発生しましたが、なぜこれが起こっているのかまだわかりません。これはシナリオです:
編集
シナリオをより単純なものに変更しました。コードを実行するプログラムと、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();
}
}
残念ながら、ILSpy と Reflector.NET (バージョン 6) の両方が内部エラーを表示したため、生成された IL コードを確認できませんでした (これは anArgumentOutOfRangeException だったと思います)。ildasm を使うのが怖かったので、IL Code を直接見ようとはしませんでした。
生成された IL コードと関係があると思いますが、問題の原因となっているシナリオは考えられません。
ここで何が起こっているのですか?シナリオが十分に明確でない場合は、コメントを残してください。より明確にするよう努めます。
編集:
使用した .NET バージョン: 4.0。アプリケーションは、VS 2010 SP1 を使用する ConsoleApplication です。ビルド プラットフォームのターゲットは AnyCPU ですが、x86 を使用している場合にも問題が発生します。私のマシンには 64 ビット システム (Windows 7) があります。この例外は、.NET 4.0 クライアント プロファイルを使用している場合にも発生します。
この例は単一のプロジェクトであり、外部/管理されていないライブラリは使用されていないため、推奨される問題 (64 ビットの実行時に 32 ビット アセンブリを参照するなど) のみが発生することはありません。