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 调试测试时。当我越过上面的行时,System.BadImageFormatException 会通过 Castle.DynamicProxy 从 System.Reflection.Emit 抛出。这可能类似于Ayende Rahien 发布的内容吗?

现在的解决方法是为 IFooRepo 实现一个假的,但我很好奇为什么会为这种场景生成一个糟糕的图像并且有解决办法吗?System.Reflection.Emit 有问题吗?还是我在自己的代码中遗漏了一些明显的东西?

编辑:为 GetFoo() 发布了不正确的签名。将签名更正为 GetFoo<T, F>(),从而正确重现了问题。安装 GDR 后,此问题仍然存在。

编辑:似乎如果对 F 的约束包括类型参数 T BadImageFormatException 就会引发。但是我将其更改为,例如where F : class, new(),然后一切都按预期工作。

4

2 回答 2

2

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

于 2009-07-20T17:10:51.350 回答
0

您是否安装了 .NET 3.5 SP1 GDR这是一个已知问题

于 2009-05-17T08:37:16.887 回答