C# 温莎粘土城堡2.5

C# 温莎粘土城堡2.5,c#,dynamic,.net-4.0,castle-windsor,C#,Dynamic,.net 4.0,Castle Windsor,我刚刚下载了DynamicObjectFramework,遇到了关于版本的问题。Clay使用“castle”v2.0的功能,而我有一个项目已经开始引用v2.5。不用说,为了让事情变得更有趣,我对所有的“城堡”和国际奥委会都是一个完全的初学者 真正的问题是升级clay solution中的引用会导致折旧方法警告。无论您是否禁止该方法,提供的单元测试都会失败,在“InterfaceProxyBehavior”的“Intercept”中的以下代码中出现“Cannot perform runtime b

我刚刚下载了DynamicObjectFramework,遇到了关于版本的问题。Clay使用“castle”v2.0的功能,而我有一个项目已经开始引用v2.5。不用说,为了让事情变得更有趣,我对所有的“城堡”和国际奥委会都是一个完全的初学者

真正的问题是升级clay solution中的引用会导致折旧方法警告。无论您是否禁止该方法,提供的单元测试都会失败,在“InterfaceProxyBehavior”的“Intercept”中的以下代码中出现“Cannot perform runtime binding on a null reference”异常:

生成运行时警告的代码位于“DefaultClayActivator”的“CreateInstance”中:

如前所述,我对Castle Windsor还是一个完全的初学者,刚刚开始参加国际奥委会,所以还没有遇到过代理的东西。令人沮丧的是,我甚至不知道错误消息告诉我什么,或者要求我做什么

是否有人已经将Clay移植到castle项目的2.5版,以便了解所需的步骤。或者任何一个有过城堡这一部分经验的人都可以对错误和我可能需要做什么来解决它提供更多的信息

已更新

对于失败的功能,我仍然不太清楚,但我有机会在castle.core中重新查看运行它的代码,包括v2.0(works)和v2.5(breaks)。附件是调试信息的两个图像,分别是调试信息工作时的图像和调试信息中断时的图像。下面是它失败的测试,我已经用一条评论指出了这个调用

namespace ClaySharp.Tests {
    [TestFixture]
    public class BinderFallbackTests {
       ...
    [Test]
    public void TestInvokePaths() {
        var dynamically = ClayActivator.CreateInstance<Alpha>(new IClayBehavior[] { 
            new InterfaceProxyBehavior(), 
            new AlphaBehavior() 
        });
        Alpha statically = dynamically;
        IAlpha interfacially = dynamically;

        Assert.That(dynamically.Hello(), Is.EqualTo("World-"));
        Assert.That(statically.Hello(), Is.EqualTo("World-"));
        Assert.That(interfacially.Hello(), Is.EqualTo("World-"));  // <- Fails on this call

        Assert.That(dynamically.Foo(), Is.EqualTo("Bar-"));
        Assert.That(interfacially.Foo(), Is.EqualTo("Bar-"));

        Assert.Throws<RuntimeBinderException>(() => dynamically.MissingNotHandled());
    }
    ...
  }
}
namespace.Tests{
[测试夹具]
公共类BinderFallbackTests{
...
[测试]
公共void TestInvokePaths(){
var dynamicy=ClayActivator.CreateInstance(新的IClayBehavior[]{
新的InterfaceProxy行为(),
新AlphaBehavior()
});
α静态=动态;
IAlpha接口=动态;
Assert.That(dynamicy.Hello(),是.EqualTo(“World-”));
Assert.That(staticly.Hello(),是.EqualTo(“World-”));
Assert.That(interfacely.Hello(),Is.EqualTo(“World-”);//dynamic.MissingNotHandled());
}
...
}
}
这是使用castle.core的v2.5时的调试信息,会引发异常:

这是使用castle.core的v2.0(可以工作)对导致v2.5问题的同一调用/线路进行调试的信息

我从来没有用过这种粘土,所以下面所有的东西都是基于假设的

来自
BindInvoker
的错误消息不是Castle错误,但我猜这是因为调用程序试图绑定到代理的调用目标,而在DynamicProxy 2.1中,在某些情况下,代理的调用目标通常有一个值,这是错误的,后来的版本2.2和2.5修复了这个问题,但这是一个突破性的变化,你现在正在经历

另一条错误消息告诉您

使用CreateClassProxyType方法 相反


这是您注释掉的另一种方法。这里有什么不明显的地方?

我从来没有用过这个粘土东西,所以下面所有的东西都是基于假设的

来自
BindInvoker
的错误消息不是Castle错误,但我猜这是因为调用程序试图绑定到代理的调用目标,而在DynamicProxy 2.1中,在某些情况下,代理的调用目标通常有一个值,这是错误的,后来的版本2.2和2.5修复了这个问题,但这是一个突破性的变化,你现在正在经历

另一条错误消息告诉您

使用CreateClassProxyType方法 相反

这是您注释掉的另一种方法。这里有什么不明显的地方?

看来我解决了这个问题。(所有测试均通过)

请参阅我创建的codeplex上的工作项以及我对fork所做的更改:

看来我解决了这个问题。(所有测试均通过)

请参阅我创建的codeplex上的工作项以及我对fork所做的更改:

一些关于粘土动态对象的精彩教程:

  • 可锻C#动态物体第1部分

  • 可锻C#动态物体第2部分


一些关于粘土动态对象的精彩教程:

  • 可锻C#动态物体第1部分

  • 可锻C#动态物体第2部分


谢谢@Krzysztof,在第2个代码部分中,注释掉的行是使用v2.0的原始代码-这将创建一个使用第2个格式的设计时警告/错误。无论我使用哪种格式,我都会在“invoker(invocation);”代码上获得null运行时绑定异常。解决方案是在某些情况下删除对调用者的调用吗?如果是,我可以做什么检查?对不起,真的只是从DynamicProxy等开始。不用担心,保罗。另一个问题更难解决。MoQ讨论组对该主题进行了讨论和解释。我可以稍后再把它挖出来。干杯。用额外的调试信息更新了问题谢谢Krsysztof,我将根据感觉/看起来您已经给了我解决方案,将此标记为已回答。这不是你的错,现在我不知道该怎么办:)我将继续比赛,并试图与红土队后面的球员交谈。当我发现或者弄清楚需要什么时,我会更新这个问题。嘿,保罗,你和红土队的人有联系吗?我正在尝试将Clay升级到Castle 2.5,但遇到了完全相同的错误。感谢@Krzysztof,在第二个代码部分中,注释掉的行是使用v2.0的原始代码-这会创建一个设计时警告/错误,建议使用第二个格式。无论我使用哪种格式,我都会在“invoker(invocation);”代码上获得null运行时绑定异常。解决方案是在某些情况下删除对调用者的调用吗?如果是,我可以做什么检查?对不起,真的只是从DynamicProxy等开始
       //var proxyType = _builder.CreateClassProxy(baseType, options);
       var proxyType = _builder.CreateClassProxyType(baseType, null, options);
namespace ClaySharp.Tests {
    [TestFixture]
    public class BinderFallbackTests {
       ...
    [Test]
    public void TestInvokePaths() {
        var dynamically = ClayActivator.CreateInstance<Alpha>(new IClayBehavior[] { 
            new InterfaceProxyBehavior(), 
            new AlphaBehavior() 
        });
        Alpha statically = dynamically;
        IAlpha interfacially = dynamically;

        Assert.That(dynamically.Hello(), Is.EqualTo("World-"));
        Assert.That(statically.Hello(), Is.EqualTo("World-"));
        Assert.That(interfacially.Hello(), Is.EqualTo("World-"));  // <- Fails on this call

        Assert.That(dynamically.Foo(), Is.EqualTo("Bar-"));
        Assert.That(interfacially.Foo(), Is.EqualTo("Bar-"));

        Assert.Throws<RuntimeBinderException>(() => dynamically.MissingNotHandled());
    }
    ...
  }
}