首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >城堡DynamicProxy -创建涉及用作GTR的GTP的代理时失败

城堡DynamicProxy -创建涉及用作GTR的GTP的代理时失败
EN

Stack Overflow用户
提问于 2012-02-08 00:13:01
回答 1查看 4.2K关注 0票数 68

好吧,现在我真的很困惑。

我最初使用的是这个问题,根据海报,这是Castle.DynamicProxy版本的ILMerged在最新Rhino.Mocks库中的一个问题。据几个权威人士称,它已经被修复在最新的城堡中,但是那个图书馆并没有把它变成一个新的Rhino.Mocks。大多数人说“只要下载犀牛的源代码和最新的城堡,并建立你自己的版本”。

所以,我正是这样做的;我从Ayende's GitHub抓取了Rhino主干的一个ZIP,打开它,并构建了它。然后,像一个好的小TDDer一样,我创建了一个单元测试以确保我的更改有效(因为最新的城堡将DynamicProxy折叠为核心,需要一些重要的引用更改):

代码语言:javascript
复制
    [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?以下消息失败:

'ITestRestrictedInterfaceProxy83ad369cdf41472c857f61561d434436‘:程序集'DynamicProxyGenAssembly2,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null’上的方法'TestMethod‘试图隐式地实现一个带有较弱类型参数约束的接口方法。

...However,当我将此测试复制并粘贴到Rhino.Mocks.Tests项目中的一个夹具中时,在不对引用库进行任何更改的情况下,测试就会通过。我对下载的源代码进行了零更改。我对测试方法和双方相关的接口/对象进行了零更改。我构建了一个新的Rhino.Mocks DLL (没有IL-合并城堡库),并将其复制到我的生产解决方案中,重新运行测试,但仍然失败了。

见鬼?

EN

回答 1

Stack Overflow用户

发布于 2013-02-13 06:21:06

我不是城堡专家,也不是编译器专家,但我相信问题是隐藏在RhinoMocks.Tests程序集中的一点魔力:

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

代码语言:javascript
复制
using System.Runtime.CompilerServices;
using Rhino.Mocks;

[assembly: InternalsVisibleTo(RhinoMocks.StrongName)]

为了完整起见,RhinoMocks.StrongName被定义为:

代码语言:javascript
复制
/// <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();
}

在使用Moq,这个问题有记录在案吗?时,我也看到了类似的问题。

问题是,DynamicProxy需要动态派生一个新类型,但是没有可见性来查看您的接口,这是程序集的内部接口。简单地将InternalsVisibleTo添加到测试库中DynamicProxyGenAssembly2可以解决这个问题。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9186087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档