Сегодня у меня возникла очень странная проблема, которую я смог решить, но до сих пор не понимаю, почему это происходит. Это сценарий:
РЕДАКТИРОВАТЬ
Я изменил сценарий, чтобы сделать его намного проще: у меня есть программа, которая выполняет код, и 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. Целью платформы сборки является AnyCPu, но проблема также проявляется при использовании x86. Моя машина имеет 64-битную систему (Windows 7). Исключение также возникает при использовании клиентского профиля .NET 4.0.
Пример представляет собой один проект, внешние/неуправляемые библиотеки не используются, поэтому не должны возникать только предлагаемые проблемы (например, ссылка на 32-разрядную сборку при запуске 64-разрядной версии).
yield
. - person Adam Houldsworth   schedule 14.08.2012