NHibernate的1.2在.NET 4.0解决方案 [英] NHibernate 1.2 in a .NET 4.0 solution

查看:257
本文介绍了NHibernate的1.2在.NET 4.0解决方案的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


我有一个基于NHibernate的1.2的一些项目,我想将它们添加到一个.NET 4.0的解决方案,但我得到一个AmbiguousMatchException。
不管这些项目是针对2.0或4.0的框架。
它的工作原理,如果我把它们添加到一个.NET 3.5的解决方案。

有没有人有经验吗?

下面是例外:

  [AmbiguousMatchException:发现不明确的匹配]
   System.RuntimeType.GetMethodImpl(字符串名称,的BindingFlags bindingAttr,粘合剂粘合,CallingConventions callConv,键入[]类型,ParameterModifier []调节剂)9607924
   System.Type.GetMethod(字符串名称)+29
   Castle.DynamicProxy.Builder。codeBuilder.SimpleAST.LockBlockEx pression.Emit(IEasyMember成员的ILGenerator根)+192
   Castle.DynamicProxy.Builder。codeBuilder.SimpleAST.Ex pressionStatement.Emit(IEasyMember成员的ILGenerator根)+52
   Castle.DynamicProxy.Builder。codeBuilder.Abstract codeBuilder.Generate(IEasyMember成员的ILGenerator IL)+370
   Castle.DynamicProxy.Builder。codeBuilder.EasyMethod.Generate()+71
   Castle.DynamicProxy.Builder。codeBuilder.AbstractEasyType.EnsureBuildersAreInAValidState()706
   Castle.DynamicProxy.Builder。codeBuilder.AbstractEasyType.BuildType()+90
   Castle.DynamicProxy.Builder。codeGenerators.Base codeGenerator.CreateType()+55
   Castle.DynamicProxy.Builder。codeGenerators.ClassProxyGenerator.Generate code(类型基类,类型[]接口)573
   Castle.DynamicProxy.Builder.DefaultProxyBuilder.CreateClassProxy(类型theClass描述,键入[]接口)+87
   Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(类型基类,类型[]接口,IInterceptor拦截,布尔checkAbstract,对象[] argumentsForConstructor)+116
   NHibernate.Proxy.CastleProxyFactory.GetProxy(对象ID,ISessionImplementor会话)+136

[HibernateException的:创建代理实例失败]
   NHibernate.Proxy.CastleProxyFactory.GetProxy(对象ID,ISessionImplementor会话)+270
   NHibernate.Persister.Entity.AbstractEntityPersister.CreateProxy(对象ID,ISessionImplementor会话)+17
   NHibernate.Impl.SessionImpl.DoLoadByClass(类型clazz中,对象ID,布尔checkDeleted,布尔allowProxyCreation)+354
   NHibernate.Impl.SessionImpl.InternalLoad(类型clazz中,对象ID,布尔跃跃欲试,布尔ISNULLABLE)+52
   NHibernate.Type.EntityType.ResolveIdentifier(对象ID,ISessionImplementor会话)+37
   NHibernate.Type.EntityType.ResolveIdentifier(对象ID,ISessionImplementor会议,对象所有者)+55
   NHibernate.Impl.SessionImpl.InitializeEntity(obj对象)187
   NHibernate.Loader.Loader.InitializeEntitiesAndCollections(IList的hydratedObjects,对象resultSetId,ISessionImplementor会话)+229
   NHibernate.Loader.Loader.DoQuery(ISessionImplementor会议,QueryParameters queryParameters,布尔returnProxies)702
   NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor会议,QueryParameters queryParameters,布尔returnProxies)+62
   NHibernate.Loader.Loader.DoList(ISessionImplementor会议,QueryParameters queryParameters)+51
   NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor会议,QueryParameters queryParameters)+18
   NHibernate.Loader.Loader.List(ISessionImplementor会议,QueryParameters queryParameters,的ISet querySpaces,ITYPE [] resultTypes)+81
   NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor会话)+36
   NHibernate.Impl.SessionImpl.Find(CriteriaImpl标准,IList的结果)+ 315
   NHibernate.Impl.SessionImpl.Find(CriteriaImpl标准)+66
   NHibernate.Impl.CriteriaImpl.List()+54
   [我的code调用Criteria.List()]
 

解决方案

随着RUP的评论,我决定改变城堡DynamicProxy 1.1.5和重新编译的来源。
问题是调用与反思方法System.Threading.Monitor.Enter不指定参数(这是因为在.NET 2.0中只有1签字),但由于.NET 4.0的方法有2重载。

我已经修改了类Castle.DynamicProxy.Builder。codeBuilder.SimpleAST.LockBlockEx pression,更改行

  gen.Emit(欧普codes.Call的typeof(监视器).GetMethod(回车));
 

与行

  gen.Emit(欧普codes.Call的typeof(监视器).GetMethod(回车,新类型[] {typeof运算(对象)}));
 

我有NHibernate的1.2 from SourceForge上的同时,我拆开城堡DynamicProxy 1.1.5与反射的code。


I have some projects based on NHibernate 1.2 and I'd like to add them to a .NET 4.0 solution, but I get an AmbiguousMatchException.
No matter if these projects are targeted to 2.0 or 4.0 framework.
It works if I add them to a .NET 3.5 solution.

Does anyone have experience with that?

Here is the exception:

[AmbiguousMatchException: Ambiguous match found.]
   System.RuntimeType.GetMethodImpl(String name, BindingFlags bindingAttr, Binder binder, CallingConventions callConv, Type[] types, ParameterModifier[] modifiers) +9607924
   System.Type.GetMethod(String name) +29
   Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.LockBlockExpression.Emit(IEasyMember member, ILGenerator gen) +192
   Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.ExpressionStatement.Emit(IEasyMember member, ILGenerator gen) +52
   Castle.DynamicProxy.Builder.CodeBuilder.AbstractCodeBuilder.Generate(IEasyMember member, ILGenerator il) +370
   Castle.DynamicProxy.Builder.CodeBuilder.EasyMethod.Generate() +71
   Castle.DynamicProxy.Builder.CodeBuilder.AbstractEasyType.EnsureBuildersAreInAValidState() +706
   Castle.DynamicProxy.Builder.CodeBuilder.AbstractEasyType.BuildType() +90
   Castle.DynamicProxy.Builder.CodeGenerators.BaseCodeGenerator.CreateType() +55
   Castle.DynamicProxy.Builder.CodeGenerators.ClassProxyGenerator.GenerateCode(Type baseClass, Type[] interfaces) +573
   Castle.DynamicProxy.Builder.DefaultProxyBuilder.CreateClassProxy(Type theClass, Type[] interfaces) +87
   Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type baseClass, Type[] interfaces, IInterceptor interceptor, Boolean checkAbstract, Object[] argumentsForConstructor) +116
   NHibernate.Proxy.CastleProxyFactory.GetProxy(Object id, ISessionImplementor session) +136

[HibernateException: Creating a proxy instance failed]
   NHibernate.Proxy.CastleProxyFactory.GetProxy(Object id, ISessionImplementor session) +270
   NHibernate.Persister.Entity.AbstractEntityPersister.CreateProxy(Object id, ISessionImplementor session) +17
   NHibernate.Impl.SessionImpl.DoLoadByClass(Type clazz, Object id, Boolean checkDeleted, Boolean allowProxyCreation) +354
   NHibernate.Impl.SessionImpl.InternalLoad(Type clazz, Object id, Boolean eager, Boolean isNullable) +52
   NHibernate.Type.EntityType.ResolveIdentifier(Object id, ISessionImplementor session) +37
   NHibernate.Type.EntityType.ResolveIdentifier(Object id, ISessionImplementor session, Object owner) +55
   NHibernate.Impl.SessionImpl.InitializeEntity(Object obj) +187
   NHibernate.Loader.Loader.InitializeEntitiesAndCollections(IList hydratedObjects, Object resultSetId, ISessionImplementor session) +229
   NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) +702
   NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) +62
   NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) +51
   NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) +18
   NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet querySpaces, IType[] resultTypes) +81
   NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor session) +36
   NHibernate.Impl.SessionImpl.Find(CriteriaImpl criteria, IList results) +315
   NHibernate.Impl.SessionImpl.Find(CriteriaImpl criteria) +66
   NHibernate.Impl.CriteriaImpl.List() +54  
   [my code calling Criteria.List()]

解决方案

Following Rup's comment, I resolved changing the sources of Castle DynamicProxy 1.1.5 and recompiling.
The problem is invoking with reflection the method System.Threading.Monitor.Enter without specifying arguments (that's because in .NET 2.0 there is only 1 signature), but since .NET 4.0 that method has 2 overloads.

I've modified the class Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.LockBlockExpression, changing the row

gen.Emit(OpCodes.Call, typeof(Monitor).GetMethod("Enter"));

with the row

gen.Emit(OpCodes.Call, typeof(Monitor).GetMethod("Enter", new Type[] { typeof(object) }));

I've got the sources of NHibernate 1.2 from SourceForge while I disassembled the code of Castle DynamicProxy 1.1.5 with Reflector.

这篇关于NHibernate的1.2在.NET 4.0解决方案的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆