Почему получение макета, созданного с помощью Moq, вызывает исключение System.BadImageFormatException? - PullRequest
5 голосов
/ 17 мая 2009

Этот вопрос может быть связан с другим вопросом, и он, безусловно, приводит к исключению System.BadImageFormatException. Может быть, это одно и то же, но по-разному выставлено?

У меня есть следующий код:

public interface IFoo<T> where T : class, new() {
  T FooMethod(object o);
}

public interface IFooRepo {
  F GetFoo<T, F>() where T : class, new() where F : IFoo<T>;
}

Затем у меня есть тест, который имитирует IFooRepo, используя Moq следующим образом:

var instance = new Mock<IFooRepo>().Object;

Приведенный выше код работает нормально, за исключением случаев отладки теста в Visual Studio 2008. Когда я перехожу указанную выше строку, исключение System.BadImageFormatExmat выдается из System.Reflection.Emit через Castle.DynamicProxy. Может ли это быть похоже на что-то , опубликованное Ayende Rahien?

Теперь обходной путь состоит в том, чтобы реализовать фальшивку для IFooRepo, но мне любопытно, почему генерируется плохое изображение для такого сценария и есть ли исправление? Не глючит ли System.Reflection.Emit? Или я упускаю что-то очевидное в своем собственном коде?

РЕДАКТИРОВАТЬ : добавлена ​​неверная подпись для GetFoo (). Исправлена ​​подпись для GetFoo (), которая правильно воспроизводит проблему. После установки ГДР эта проблема сохраняется.

EDIT : Кажется, что если ограничение на F включает параметр типа T, то BadImageFormatException повышается. Но я изменяю его, скажем, where F : class, new(), тогда все работает как положено.

Ответы [ 2 ]

2 голосов
/ 20 июля 2009

FWIW, я согласен, что пост Айенде объясняет это поведение, и что это происходит только тогда, когда ограничения на один общий параметр ссылаются на другой. Я сталкиваюсь с этим и с ГДР и использую тот же обходной путь с подделками, закодированными вручную.

0 голосов
/ 17 мая 2009
...