C# 温莎粘土城堡2.5
我刚刚下载了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)。附件是调试信息的两个图像,分别是调试信息工作时的图像和调试信息中断时的图像。下面是它失败的测试,我已经用一条评论指出了这个调用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
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部分
//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());
}
...
}
}