有没有反编译NHibernate 4.0生成的动态代理类的方法?
问题描述:
This question was already asked here on SO但答案指的是NHibernate 3.2.0。有没有反编译NHibernate 4.0生成的动态代理类的方法?
那么,有没有一种方法来反编译NHibernate 4.0生成的动态代理类?
答
使用自定义的Proxyfactory应该有所斩断。使用FluentNHibernate
var config = Fluently.Configure()
.ProxyFactoryFactory<MyProxyFactoryFactory>()
实施例的配置,它使用的类
class MyProxyFactoryFactory : DefaultProxyFactoryFactory, IProxyFactoryFactory
{
IProxyFactory IProxyFactoryFactory.BuildProxyFactory()
{
return new MyProxyFactory();
}
}
class MyProxyFactory : AbstractProxyFactory, IProxyAssemblyBuilder
{
const string PathToSave = "D:/";
private readonly ProxyFactory factory;
public MyProxyFactory()
{
factory = new ProxyFactory(this);
}
public override INHibernateProxy GetProxy(object id, ISessionImplementor session)
{
try
{
var initializer = new DefaultLazyInitializer(EntityName, PersistentClass, id, GetIdentifierMethod, SetIdentifierMethod, ComponentIdType, session);
object proxyInstance = IsClassProxy
? factory.CreateProxy(PersistentClass, initializer, Interfaces)
: factory.CreateProxy(Interfaces[0], initializer, Interfaces);
return (INHibernateProxy)proxyInstance;
}
catch (Exception ex)
{
throw new HibernateException("Creating a proxy instance failed", ex);
}
}
public override object GetFieldInterceptionProxy(object instanceToWrap)
{
var interceptor = new DefaultDynamicLazyFieldInterceptor();
return factory.CreateProxy(PersistentClass, interceptor, new[] { typeof(IFieldInterceptorAccessor) });
}
public AssemblyBuilder DefineDynamicAssembly(AppDomain appDomain, AssemblyName name)
{
return appDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave, PathToSave);
}
public ModuleBuilder DefineDynamicModule(AssemblyBuilder assemblyBuilder, string moduleName)
{
return assemblyBuilder.DefineDynamicModule(moduleName, moduleName + ".mod", true);
}
public void Save(AssemblyBuilder assemblyBuilder)
{
assemblyBuilder.Save("generatedAssembly.dll");
}
}
我得到了一个异常:“无法转换类型‘System.Reflection.Emit.InternalAssemblyBuilder’为类型“的对象System.Reflection.Emit .AssemblyBuilder' –
嗯,它在我为此编写的一个快速测试程序中工作,但当我再次写入时不再工作,我将调查我什么时候有空。 – Firo