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

5
这个问题可能与另一个问题有关,它肯定会导致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异常。这可能类似于Ayende Rahien发布的某些内容吗?
现在的解决方法是实现IFooRepo的虚拟版本,但我想知道为什么会为这种情况生成错误图像,是否有修复方法? System.Reflection.Emit有缺陷吗?或者我在自己的代码中遗漏了一些明显的东西吗? 编辑:发帖时GetFoo()签名不正确。已更正签名为GetFoo<T, F>(),以正确重现问题。安装GDR后,此问题仍然存在。 编辑:看起来,如果F的约束包括类型参数T,则会引发BadImageFormatException异常。但是,如果将其更改为,例如where F:class,new(),则一切正常。
2个回答

2

就我个人而言,我同意Ayende的帖子解释了这种行为,并且只有在一个泛型参数的限制引用另一个泛型参数时才会发生。我也遇到过这个问题,在GDR中采用了手工编码的伪造方法来解决。


0

我已经安装了.NET 3.5 SP1,但不知道是否安装了GDR。我该如何查看?你是如何将Ayende的帖子与GDR下载页面联系起来的?在发布问题之前,我曾看过Ayende的帖子,但没有看到关于GDR的参考。顺便说一句,谢谢你提供的链接,我很快就会查看它。 - Jonathon Watney
Scott Hanselman在页面底部评论了如何确定是否安装了GDR。http://www.hanselman.com/blog/NET35SP1GDRIsAvailableToDownload.aspx - Jonathon Watney
GDR已经在我的情况下应用了。然后我发现我发布了错误的代码片段。我已经在问题中更正了这些片段。 - Jonathon Watney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接