使用内部构造函数为抽象类创建动态代理

时间:2012-04-07 13:04:21

标签: c# dynamic proxy castle-dynamicproxy dynamic-proxy

我想为BCL中的类型创建动态代理,BCL是一个带有内部构造函数的抽象类。我一直是城堡的动态代理,这失败了一个例外,说明没有无参数构造函数(它们是 - 它是内部的)。

有没有办法用城堡实现这个目标?如果没有任何其他动态代理框架能够做到这一点?这是开发的开始,因此更改框架很容易。

2 个答案:

答案 0 :(得分:4)

DynamicProxy不会做任何你在C#中无法做到的事情。所以它不能从它无法构造的类型继承,包括没有DynamicProxy可访问的构造函数的类型。


如果您拥有程序集,则可以通过添加以下内容通过AssemblyInfo.cs提供DynamicProxy访问:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

需要注意的重要事项是文字值DynamicProxyGenAssembly2这是由DynamicProxy创建的内存程序集中,您需要提供 it 访问权限。

答案 1 :(得分:0)

我刚刚找到了一种无需修改目标程序集即可实现的方法。

关键是TypeBuilder.DefineConstructor允许您创建一个构造函数而无需调用任何基础的构造函数。因此,可以使用公共构造函数动态创建一个继承原始类的FAKE类。

然后仅从伪类创建代理。您可以将真实的目标对象记录在IInterceptor对象中,或在伪类的某些字段中记录。

顺便说一句,我使用这个技巧来记录ILGenerator.Emit个呼叫。有人知道更简单的拆卸ILGenerator.m_ILStream的方法吗?