2009-05-17 14 views
5

To pytanie może być związane z pytaniem another i na pewno wynika z wyjątku System.BadImageFormatException. Może to jest to samo, ale wyeksponowane inaczej?Dlaczego pobieranie wyśmiewanej instancji za pomocą Moq powoduje wygenerowanie wyjątku System.BadImageFormatException?

Mam następujący kod:

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>; 
} 

Wtedy mam test, który drwi IFooRepo użyciu MOQ tak:

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

Powyższy kod działa poprawnie z wyjątkiem podczas debugowania test z audiowizualny Studio 2008. Kiedy przekroczę powyższą linię, wyjątek System.BadImageFormatException jest generowany z System.Reflection.Emit przez Castle.DynamicProxy. Czy to może być podobne do something opublikowanej przez Ayende Rahien?

Teraz obejściem jest wdrożenie fałszywego dla IFooRepo, ale jestem ciekawy, dlaczego generowany jest zły obraz dla tego rodzaju scenariusza i czy istnieje poprawka? Czy bug System.Reflection.Emit? Czy też brakuje mi czegoś oczywistego w moim własnym kodzie?

EDIT: Wysłano niepoprawny podpis dla GetFoo(). Poprawiono sygnaturę do GetFoo < T, F >(), która poprawnie odtwarza problem. Po zainstalowaniu GDR problem ten utrzymuje się.

EDIT: Wydaje się, że jeśli wiązanie F zawiera parametr typu T BadImageFormatException jest podniesiony. Ale zmienię go na, powiedzmy where F : class, new(), wtedy wszystko działa zgodnie z oczekiwaniami.

Odpowiedz

0
+0

Mam zainstalowany dodatek .NET 3.5 SP1. Nie wiem, czy GDR jest zainstalowany. Jak mogę to powiedzieć? I w jaki sposób utworzyłeś połączenie między postem Ayende a stroną pobierania GDR? Widziałem post Ayende przed opublikowaniem mojego pytania, ale nie widziałem odniesienia do NRD. Aha i dzięki za link BTW, sprawdzę to wkrótce. –

+0

Scott Hanselman komentuje w dolnej części strony, jak ustalić, czy GDR jest zainstalowany. http://www.hanselman.com/blog/NET35SP1GDRIsAvailableToDownload.aspx –

+0

GDR został już zastosowany w moim przypadku. Potem odkryłem, że zamieściłem niepoprawne fragmenty kodu. Poprawiłem fragmenty w pytaniu. –

2

FWIW, Zgadzam się, że post Ayende wyjaśnia to zachowanie, i że dzieje się tak tylko wtedy, gdy ograniczenia jednego ogólnego parametru odwołują się do innego. Ja również spotykam się z NRD i zastosowałem to samo obejście ręcznie kodowanych podróbek.

Powiązane problemy