Questa domanda potrebbe essere correlata alla domanda another e risulta sicuramente con System.BadImageFormatException. Forse è la stessa cosa ma esposta in modo diverso?Perché l'istanza derisa creata con Moq genera un System.BadImageFormatException?
Ho il seguente codice:
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>;
}
Poi ho un test che prende in giro IFooRepo utilizzando Moq in questo modo:
var instance = new Mock<IFooRepo>().Object;
Il codice di cui sopra funziona bene, tranne quando il debug del test con Visual Studio 2008. Quando passo sopra la riga precedente viene generata una System.BadImageFormatException da System.Reflection.Emit tramite Castle.DynamicProxy. Potrebbe essere simile a something pubblicato da Ayende Rahien?
Ora la soluzione alternativa è implementare un falso per IFooRepo ma sono curioso di sapere perché un'immagine cattiva viene generata per questo tipo di scenario e c'è una soluzione? System.Reflection.Emit è bacato? O mi manca qualcosa di ovvio nel mio codice?
MODIFICA: ha immesso la firma errata per GetFoo(). Correzione della firma su GetFoo < T, F >(), che riproduce correttamente il problema. Con GDR installato questo problema persiste.
EDIT: Sembra che se il vincolo su F include il parametro di tipo T BadImageFormatException viene generato. Ma lo cambio, diciamo where F : class, new()
, quindi tutto funziona come previsto.
Ho installato .NET 3.5 SP1. Non so se il GDR è installato però. Come posso dire? E come hai stabilito la connessione tra il post di Ayende e la pagina di download di GDR? Avevo visto il post di Ayende prima di pubblicare la mia domanda ma non ho visto alcun riferimento alla DDR. Oh e grazie per il link BTW, lo controllerò presto. –
Scott Hanselman commenta nella parte inferiore della pagina come determinare se il GDR è installato. http://www.hanselman.com/blog/NET35SP1GDRIsAvailableToDownload.aspx –
Il GDR era già applicato nel mio caso. Poi ho scoperto che ho postato i frammenti di codice errati. Ho corretto i frammenti nella domanda. –