好吧,现在我真的很困惑。
我最初遇到了这个问题,根据海报的说法,这是 ILMerged 到最新的 Rhino.Mocks 库中的 Castle.DynamicProxy 版本的问题。据有关该主题的几位权威人士称,它已在最新的 Castle 中修复,但该库尚未将其变成新的 Rhino.Mocks。大多数人都在说“只需下载 Rhino 源代码和最新的 Castle 并构建自己的版本”。
所以,我就是这样做的;我从 Ayende 的 GitHub 中获取了 Rhino 主干源代码的 ZIP,打开并构建了它。然后,像一个优秀的小 TDDer 一样,我创建了一个单元测试以确保我的更改有效(因为最新的 Castle 将 DynamicProxy 折叠到 Core 中,需要一些重大的引用更改):
[Test]
public void MockOfInterfaceMethodWithInterfaceGTR()
{
var mock = mocks.DynamicMock<ITestRestrictedInterface>();
Assert.NotNull(mock);
Expect.Call(mock.TestMethod(new Object2())).IgnoreArguments().Return(5);
mocks.ReplayAll();
Assert.AreEqual(5, mock.TestMethod(new Object2()));
}
...
internal interface ITestGenericInterface<TRest> where TRest:IObject1
{
int TestMethod<T>(T input) where T : TRest;
}
internal interface ITestRestrictedInterface:ITestGenericInterface<IObject2> { }
internal interface IObject1 { }
internal interface IObject2:IObject1 { }
internal class Object2:IObject2 { }
结果,当我使用最新发布的 Rhino 在我自己的生产代码中运行时?失败并显示以下消息:
System.TypeLoadException:来自程序集'DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = Neutral,PublicKeyToken = null'的类型'ITestRestrictedInterfaceProxy83ad369cdf41472c857f61561d434436'上的方法'TestMethod'试图隐式实现具有较弱类型参数约束的接口方法。
...但是,当我将此测试复制并粘贴到 Rhino.Mocks.Tests 项目中的夹具中,而不对引用的库进行任何更改时,测试通过。我对下载的源代码进行了零更改。我对双方的测试方法和相关接口/对象进行了零更改。我构建了一个新的 Rhino.Mocks DLL(没有 IL 合并 Castle 库)并将其与 Castle 库一起复制回我的生产解决方案,重新运行测试,但仍然失败并显示相同的消息。
怎么回事?