好吧,现在我真的很困惑。
我最初遇到了这个问题,根据发布者的说法,这是ILMerges到最新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,版本= 0.0.0.0,区域性=中性,PublicKeyToken = null”中的类型“ ITestRestrictedInterfaceProxy83ad369cdf41472c857f61561d434436”上的方法“ TestMethod”尝试隐式实现类型参数约束较弱的接口方法。
...但是,当我将此测试复制并粘贴到Rhino.Mocks.Tests项目中的固定装置中时,无需对引用的库进行任何更改,则测试会通过。我对下载的源进行了零更改。我对测试方法和相关接口/对象都进行了零更改。我构建了一个新的Rhino.Mocks DLL(没有IL合并Castle库),并将其与Castle库一起复制回我的生产解决方案,重新运行测试,但仍然失败,并显示相同的消息。
WTF?