2009-05-17 11 views
5

Esta pregunta puede estar relacionada con la pregunta another y sin duda da como resultado una excepción System.BadImageFormatException. Tal vez es lo mismo pero expuesto de manera diferente?¿Por qué la instancia simulada creada con Moq arroja una excepción System.BadImageFormatException?

Tengo el siguiente código:

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

Entonces tengo una prueba que se burla IFooRepo usando Moq así:

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

El código anterior funciona bien, excepto cuando se depura la prueba con Visual Studio 2008. Cuando paso por encima de la línea anterior, se emite System.BadImageFormatException de System.Reflection.Emit a través de Castle.DynamicProxy. ¿Podría ser similar al something publicado por Ayende Rahien?

Ahora la solución consiste en implementar un falso para IFooRepo, pero tengo curiosidad por saber por qué se genera una mala imagen para este tipo de escenario y hay una solución? Es System.Reflection.Emit con errores? ¿O me estoy perdiendo algo obvio en mi propio código?

EDIT: Publica la firma incorrecta para GetFoo(). Se corrigió la firma en GetFoo < T, F >(), que reproduce correctamente el problema. Con la GDR instalada, este problema persiste.

EDIT: Parece que si la restricción en F incluye el parámetro de tipo T BadImageFormatException se plantea. Pero lo cambio a, digamos where F : class, new(), luego todo funciona como se esperaba.

Respuesta

0
+0

Tengo .NET 3.5 SP1 instalado. Sin embargo, no tengo idea si la GDR está instalada. ¿Cómo puedo decir? ¿Y cómo establecieron la conexión entre la publicación de Ayende y la página de descarga de la RDA? Había visto la publicación de Ayende antes de publicar mi pregunta, pero no vi ninguna referencia a la RDA. Ah, y gracias por el enlace, lo veré pronto. –

+0

Scott Hanselman comenta al final de la página cómo determinar si la GDR está instalada. http://www.hanselman.com/blog/NET35SP1GDRIsAvailableToDownload.aspx –

+0

La RDA ya se aplicó en mi caso. Luego descubrí que publiqué los fragmentos de código incorrectos. He corregido los fragmentos en la pregunta. –

2

FWIW, acepto que la publicación de Ayende explica este comportamiento, y que solo ocurre cuando las restricciones en un parámetro genérico hacen referencia a otra. También lo encuentro con la RDA, y he adoptado la misma solución de falsificaciones codificadas a mano.

Cuestiones relacionadas