c# - einrichten - proxy server



Castle DynamicProxy-Fehler beim Erstellen eines Proxys mit einem als GTR verwendeten GTP (1)

Ich bin weder ein Castle-Experte noch ein Compiler-Guru, aber ich glaube, das Problem ist ein bisschen Magie, das in der RhinoMocks.Tests-Assembly versteckt ist:

Von https://github.com/ayende/rhino-mocks/blob/master/Rhino.Mocks.Tests/TestInfo.cs

using System.Runtime.CompilerServices;
using Rhino.Mocks;

[assembly: InternalsVisibleTo(RhinoMocks.StrongName)]

Und der Vollständigkeit halber ist RhinoMocks.StrongName wie folgt definiert:

/// <summary>
/// Used for [assembly: InternalsVisibleTo(RhinoMocks.StrongName)]
/// Used for [assembly: InternalsVisibleTo(RhinoMocks.NormalName)]
/// </summary>
public static class RhinoMocks
{
    /// <summary>
    /// Strong name for the Dynamic Proxy assemblies. Used for InternalsVisibleTo specification.
    /// </summary>
    public const string StrongName =
        "DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7";

    /// <summary>
    /// Normal name for dynamic proxy assemblies. Used for InternalsVisibleTo specification.
    /// </summary>
    public const string NormalName = "DynamicProxyGenAssembly2";

    /// <summary>
    /// Logs all method calls for methods
    /// </summary>
    public static IExpectationLogger Logger = new NullLogger();
}

Ich habe ein ähnliches Problem bei der Verwendung von Moq gesehen, bei dem dieses Problem dokumentiert ist .

Das Problem besteht darin, dass DynamicProxy in Castle dynamisch einen neuen Typ ableiten muss, aber keine Sichtbarkeit hat, um Ihre interne Schnittstelle für Ihre Assembly zu sehen. Durch einfaches Hinzufügen von InternalsVisibleTo zu DynamicProxyGenAssembly2 zu Ihrer Testbibliothek sollte das Problem behoben werden.

https://ffff65535.com

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 der neuesten Rhino.Mocks-Bibliothek ist. Es wurde, nach mehreren Autoritäten zu diesem Thema, in der neuesten Burg behoben, aber diese Bibliothek hat es nicht zu einem neuen Rhino gemacht. Die meisten Leute sagen "Laden Sie einfach die Rhino-Quelle und das neueste Schloss herunter und bauen Sie Ihre eigene Version".

Also habe ich genau das gemacht; Ich nahm einen Reißverschluss der Rhino Stammquelle von Ayendes GitHub, öffnete ihn und baute ihn. Dann, wie eine gute kleine TDDer, habe ich einen Komponententest erstellt, um sicherzustellen, dass meine Änderungen funktionierten (weil das neueste Schloss DynamicProxy in den Core faltet, was einige wichtige Ä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 es in meinem eigenen Produktionscode mit dem neuesten freigegebenen Rhino läuft? Fehler mit der folgenden Nachricht:

System.TypeLoadException: Die Methode 'TestMethod' für den Typ 'ITestRestrictedInterfaceProxy83ad369cdf41472c857f61561d434436' aus Assembly 'DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = Neutral, PublicKeyToken = null' hat versucht, eine Schnittstellenmethode mit schwächeren Parameterbeschränkungen implizit zu implementieren.

... Wenn ich diesen Test jedoch in ein Fixture im Rhino.Mocks.Tests-Projekt kopiere und einfüge, ohne Änderungen an den referenzierten Bibliotheken vorzunehmen, wird der Test PASSES. Ich habe keine Änderungen an der heruntergeladenen Quelle vorgenommen. Ich habe NULL Änderungen an der Testmethode und verwandten Schnittstellen / Objekten auf beiden Seiten vorgenommen. Ich baute eine neue Rhino.Mocks-DLL (ohne IL-Zusammenführung der Castle-Bibliotheken) und kopierte sie mit Castle-Bibliotheken zurück zu meiner Produktionslösung, führte den Test erneut aus, und es schlägt immer noch mit der gleichen Nachricht fehl.

WTF?





rhino-commons