Хорошо, теперь я действительно запутался.
У меня изначально была эта проблема , которая, согласно постерам, является проблемой с версией Castle.DynamicProxy, которая находится в последней библиотеке Rhino.Mocks. Согласно нескольким авторитетам по этому вопросу, он был исправлен в последнем Замке, но эта библиотека не превратила его в новый Rhino.Mocks. Большинство людей говорят: «Просто скачайте исходный код Rhino и последнюю версию Castle и создайте свою собственную версию».
Итак, я сделал именно это; Я взял ZIP-архив с источником ствола Rhino из GitHub Айенде, открыл его и собрал. Затем, как хороший маленький 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: метод 'TestMethod' для типа
'ITestRestrictedInterfaceProxy83ad369cdf41472c857f61561d434436' из
сборка 'DynamicProxyGenAssembly2, версия = 0.0.0.0, культура = нейтральная,
PublicKeyToken = null 'попытался неявно реализовать метод интерфейса
с более слабыми ограничениями параметров типа.
... Однако, когда я копирую и вставляю этот тест в прибор в проекте Rhino.Mocks.Tests, без внесения каких-либо изменений в ссылочные библиотеки, тест PASSES. Я сделал ноль изменений в загруженном источнике. Я внес нулевые изменения в метод испытаний и соответствующие интерфейсы / объекты с обеих сторон. Я создал новую DLL-библиотеку Rhino.Mocks (без слияния IL с библиотеками Castle) и скопировал ее с помощью библиотек Castle обратно в мое производственное решение, повторно запустил тест, и он все еще не работает с тем же сообщением.
WTF?