为什么使用Moq创建的模拟实例会抛出System.BadImageFormatException?

时间:2009-05-17 04:38:53

标签: debugging moq reflection.emit castle-dynamicproxy

这个问题可能与another问题有关,它肯定会导致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>;
}

然后我有一个测试,使用Moq模拟IFooRepo,如下所示:

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

上述代码运行正常,除非在使用Visual Studio 2008调试测试时。当我跳过上面的行时,会通过Castle.DynamicProxy从System.Reflection.Emit抛出System.BadImageFormatException。这可能类似于something Ayende Rahien发布的吗?

现在的解决方法是为IFooRepo实现一个假的,但我很好奇为什么会为这种情况生成一个坏图像并且有一个修复? System.Reflection.Emit是否有错误?或者我在自己的代码中遗漏了一些明显的东西?

编辑:为GetFoo()发布了错误的签名。将签名更正为GetFoo&lt; T,F&gt;(),它正确地再现了问题。安装GDR后,此问题仍然存在。

编辑:似乎如果F上的约束包含类型参数T,则引发BadImageFormatException。但我把它更改为,where F : class, new(),然后一切都按预期工作。

2 个答案:

答案 0 :(得分:2)

FWIW,我同意Ayende的帖子解释了这种行为,并且只有当一个泛型参数的约束引用另一个时才会发生。我也遇到了GDR,并采用了手工编码假货的相同解决方法。

答案 1 :(得分:0)