问题标签 [castle-dynamicproxy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1086 浏览

c# - 使用参数代理方法时Castle DynamicProxy v1异常?

我在使用 Castle DynamicProxy v1.1.5.0 代理带有参数的方法时遇到问题。- 我得到异常“索引超出了数组的范围。”

如果我只使用没有参数的方法,或者 DynamicProxy v2,一切正常。
不幸的是,我无法说服我的项目的负责人向 v2 添加依赖项(我们已经在使用 NHibernate 附带的 v1)。

所以我的问题归结为:这可以在 v1 中完成吗?我用错了吗?

这是细节。

我已经实现了一种模拟继承的机制,而无需编译时对基类的依赖。请不要问为什么,原因很丑:(

这是一个完整的示例,展示了它是如何中断的。我引用的是 Castle.DynamicProxy.dll (v1)。如果我更改对 Castle.DynamicProxy[b]2[/b].dll (+ Castle.Core.dll) 的引用,请取消注释代码开头的#define。

抱歉代码太长了,但我担心我可能会泄露一些重要的细节......
另外:免责声明:代码示例有一些讨厌的错误!(可能比我发现的还要多:)

哇!那是一口。这是使用 v1 时发生的异常:

使用 v2 运行时,我得到的只是正确的输出:

派生 - Foo!衍生 - 巴兹!

...帮助?

0 投票
1 回答
814 浏览

asp.net - 为什么我使用 Castle DynamicProxy 得到“无效的内部状态”反射异常?

几周前,我们将 DynamicProxy 添加到我们的 ASP.NET Web 应用程序中。代码在 dev 和 QA 中运行良好,但是当我们推送到生产环境时,我们得到了以下异常(仅限堆栈跟踪顶部):

System.Reflection.Emit.TypeBuilder._InternalSetMethodIL(Int32 methodHandle, Boolean isInitLocals, Byte[] body, Byte[] LocalSig, Int32 sigLength, Int32 maxStackSize, Int32 numExceptions, __ExceptionInstance[] 异常, Int32[] tokenFixups, Int32[] rvaFixups,模块模块) +0 System.Reflection.Emit.TypeBuilder.InternalSetMethodIL(Int32 methodHandle, Boolean isInitLocals, Byte[] body, Byte[] LocalSig, Int32 sigLength, Int32 maxStackSize, Int32 numExceptions, __ExceptionInstance[] 异常, Int32[] tokenFixups, Int32[] rvaFixups,模块模块)+56 System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() +1033 System.Reflection.Emit.TypeBuilder.CreateType() +99 Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.CreateType(TypeBuilder 类型) +72 Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter。BuildType() +96 Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateType(字符串名称,Type[] 接口,INamingScope 命名范围)+854 Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateCode(Type[] 接口,ProxyGenerationOptions 选项)+834 Castle。 DynamicProxy.DefaultProxyBuilder.CreateClassProxyType(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions 选项) +133 Castle.DynamicProxy.ProxyGenerator.CreateClassProxyType(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions 选项) +52 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy , Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, Object[] constructorArguments, IInterceptor[] 拦截器) +308 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy,Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, IInterceptor[] 拦截器) +48 Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy, ProxyGenerationOptions options, IInterceptor[] 拦截器) +44

当我们第一次推送代码时它运行良好,并且 IIS 重置修复了它,所以我假设它与线程相关,但我在互联网上找不到任何关于线程安全代理生成的最佳实践的信息。建议?

更新:在阅读了更多关于这个问题的内容后,尤其是这里,我意识到一个潜在的问题——即我没有为我编写的 IProxyGenerationHook 的实现覆盖 Equals/GetHashCode,这将阻止 DynamicProxy 缓存它的类型。正如我在一般情况下看到的异常几乎一无所获,更不用说与 DP 相关了,我会假设我的遗漏导致的类型缺乏缓存是问题的根本原因,尽管我我喜欢确认。

作为记录,我的对象创建非常简单:

0 投票
1 回答
2878 浏览

castle-windsor - Windsor Container 中的 Castle 动态代理

我有一点问题。我在 Castle Windsor IOC Container 工作。现在我想做的只是弄乱一些 AOP 原则,而我特别想做的是基于方法名称执行一些日志记录。我一直在研究拦截器,目前我正在使用作为类实现的 IInterceptor 接口来使用方面执行此日志记录。问题是,如果我想在特定方法上执行日志记录,那么它会变得一团糟,因为我需要将一些逻辑放入我实现的方面以检查方法名称等......

我读过你可以使用动态代理和 IInterceptorSelector 接口和 IProxyGenerationHook 接口来完成所有这些工作。我在网上看到了一些这样的例子,但我很困惑这一切如何适合温莎容器。我的意思是我正在使用 windsor 容器,它在我的代码中实际上是对 IWindsorContainer 接口的引用来创建我的所有对象。我所有的配置都是用代码而不是 XML 完成的。

首先,除了我目前正在执行的方式之外,是否有人知道在 Windsor 容器中执行特定于方法的 AOP 的方法。

其次,我如何在 Windsor 容器中使用动态代理?

下面我添加了创建代理并使用拦截器注册我的类的代码

测试类如下:

至于拦截器,它们非常简单,如果名称以 Check 开头,只需输入一个方法。

现在,当我从容器中解析我的 TestClass 时,我得到了一个错误。

{“这是一个 DynamicProxy2 错误:混合类型 TestClassProxy 实现了 IProxyTargetAccessor,它是一个 DynamicProxy 基础结构接口,您永远不应该自己实现它。您是否尝试混合现有代理?”}

我知道我以错误的方式使用代理,但由于我没有看到任何关于如何将代理与温莎容器一起使用的具体示例,这有点令人困惑。

我的意思是,如果我想使用 LoggingProxyGenerationHook,它只是告诉拦截器首先使用以“check”开头的方法,那么这是正确的方法还是我完全走错了路。我刚刚采用代理方式,因为它看起来非常强大,我想了解如何使用这些代理进行未来的编程工作。

0 投票
3 回答
2220 浏览

c# - 从 Castle Windsor 拦截器访问方法的自定义属性

我正在尝试访问应用于城堡拦截器中的方法的自定义属性,例如:

使用以下代码:

调用该方法时拦截器触发正常,但此代码不返回自定义属性。我怎样才能做到这一点?

0 投票
2 回答
502 浏览

c# - 如何拦截、解析和编译?

这是我一段时间以来一直在努力解决的问题。我需要一种方法,要么在编译时用模板中的解析代码替换方法中的代码(想到 PostSharp),要么创建动态代理(Linfu 或 Castle)。所以给出这样的源代码

我需要把它编译成这个

使用什么技术并不重要。我尝试使用 PostSharp 的 ImplementMethodAspect,但一无所获(由于缺乏经验)。我还研究了 Linfu 框架。有人可以建议一些其他方法或方法来做到这一点,我真的很感激。我的整个项目都依赖于此。

假设:

  1. 代码可以出现在任何类中。
  2. 模板代码将始终使用属性 [Template] 进行注释
  3. 模板方法将始终返回字符串。

将代码从一种形式解析到另一种形式已经完成。现在我只需要一种方法来替换它。

“牛肉”示例:

0 投票
2 回答
29733 浏览

c# - 拦截器对我的 c# 类的真正作用是什么?

我被要求在我的 asp.net web 应用程序中实现城堡动态代理,我正在阅读我从Castle ProjectCode Project获得的关于 asp.net web 应用程序中的城堡动态代理的几篇文章....

两篇文章都与创建拦截器有关,但我不明白为什么拦截器与类一起使用......为什么我应该拦截行为正确的类?

0 投票
1 回答
1017 浏览

c# - 帮助将 mixin 从 Castle.DynamicProxy 迁移到 DynamicProxy2

我正在尝试将一些代码从使用 DynamicProxy 更新为 DynamicProxy2。特别是我们使用 DynamicProxy 来提供两个类的混合。设置是这样的:

然后假设 IHasShape 和 IHasColor 有一些明显的具体实现,我们将创建一个这样的 mixin:

除了作为代理创建的结果之外,没有 IColoredShape 的具体实现。StandardInterceptor 对 IColoredShape 对象进行调用,并将它们委托给适当的“形状”或“颜色”对象。

但是,我一直在使用新的 DynamicProxy2 并且找不到等效的实现。

0 投票
2 回答
2947 浏览

c# - 使用 autofac 和 dynamicproxy2 选择性拦截方法

我目前正在使用 Autofac-1.4.5.676、autofac contrib 和 castle DynamicProxy2 进行一些试验。目标是创建一个粗粒度分析器,可以拦截对特定接口的特定方法的调用。

问题:除了选择性部分之外,我的一切都完美无缺。我可能是错的,但我认为我需要将我的拦截器与 IProxyGenerationHook 实现结合起来,但我不知道如何做到这一点。

我的代码看起来像这样:

被截取&剖析的接口(注意我只关心剖析Update()方法)

现在,当我向容器注册我的系统时,我执行以下操作:

所有从容器中拉出的 ISomeSystemToMonitor 实例都会根据需要被拦截和分析,除了它会拦截其所有方法,而不仅仅是 Update 方法。

现在,如何扩展它以排除 Update() 以外的所有方法?正如我所说,我不明白我要如何通知容器“对于 ProfileInterceptor,使用 IProxyHookGenerator 的这个实现”。

所有帮助表示赞赏,干杯!另外,请注意我现在无法升级到 autofac2.x;我被困在1。

0 投票
1 回答
173 浏览

castle - Castle Dynamic Proxy 是否可以拦截值类型?

如果可以通过 Castle 动态代理拦截 C# 中的值类型,我有一个问题,找不到答案和任何提示?我想用 INotifyChanged 接口拦截 IDictionary。当演示者更改模型时,我需要它来更新视图。在对象中装箱十进制仅用于制作接口并不是一个好主意......也许有人知道如何引入值类型?

感谢所有答案

0 投票
1 回答
529 浏览

nhibernate - NHibernate + Remoting = ReflectionPermission 异常

在具有完全信任环境的机器(实际上是我们的开发机器)中使用 NHibernate 和 Remoting 时,我们正在处理一个问题。

当尝试将先前从服务器检索到的对象作为参数发送时,就会出现问题,该对象在其中一个属性中包含 NHibernate 代理(一个惰性代理)。

由于我们在开发机器中,网络应用程序的信任级别没有限制(它设置为完全),而且,作为一个优点,我们已经将 NHibernate 和 Castle 的程序集配置为完全信任 CAS(甚至认为它' d 不是必需的,因为 IIS 中的远程处理应用程序具有完全信任级别)。

有谁知道是什么导致了这个异常?下面的堆栈跟踪。

先感谢您。