OK, jetzt bin ich wirklich verwirrt.
Ich hatte ursprünglich dieses Problem , das laut Postern ein Problem mit der Version von Castle.DynamicProxy ist, die ILMerged in die neueste Rhino.Mocks-Bibliothek enthält. Es wurde nach Angaben mehrerer Behörden zu diesem Thema im neuesten Schloss repariert, aber diese Bibliothek hat es nicht zu einem neuen Rhino.Mocks geschafft. Die meisten Leute sagen "Laden Sie einfach die Rhino-Quelle und das neueste Schloss herunter und erstellen Sie Ihre eigene Version".
Also habe ich genau das getan; Ich holte mir eine ZIP-Datei der Rhino-Trunk-Quelle aus Ayendes GitHub, öffnete sie und baute sie. Dann habe ich wie ein guter kleiner TDDer einen Komponententest erstellt, um sicherzustellen, dass meine Änderungen funktionieren (da das neueste Castle DynamicProxy in Core faltet und einige wichtige Referenzierungsänderungen erfordert):
[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 { }
Das Ergebnis, wenn in meinem eigenen Produktionscode mit dem neuesten veröffentlichten Rhino ausgeführt? Fehler mit der folgenden Meldung:
System.TypeLoadException: Die Methode 'TestMethod' für den Typ 'ITestRestrictedInterfaceProxy83ad369cdf41472c857f61561d434436' aus der Assembly 'DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null' hat versucht, eine Parameterbeschränkung implizit mit einer schwachen Parametermethode zu implementieren.
... Wenn ich diesen Test jedoch kopiere und in ein Fixture im Rhino.Mocks.Tests-Projekt einfüge, ohne Änderungen an den Bibliotheken vorzunehmen, auf die verwiesen wird, wird der Test bestanden. Ich habe keine Änderungen an der heruntergeladenen Quelle vorgenommen. Ich habe NULL Änderungen an der Testmethode und den zugehörigen Schnittstellen / Objekten auf beiden Seiten vorgenommen. Ich habe eine neue Rhino.Mocks-DLL erstellt (ohne die Castle-Bibliotheken IL-zusammenzuführen) und sie mit Castle-Bibliotheken zurück in meine Produktionslösung kopiert, den Test erneut ausgeführt und es schlägt immer noch mit derselben Meldung fehl.
WTF?