OK、今私は本当に混乱しています。
私はもともとこの問題を抱えていました。これは、ポスターによると、最新の Rhino.Mocks ライブラリに ILMerged された 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 を作成し (Castle ライブラリを IL マージせずに)、それを Castle ライブラリと共に本番環境のソリューションにコピーし、テストを再実行しましたが、同じメッセージで失敗します。
なんてこと?