NHibernate的1.2在.NET 4.0解决方案 [英] NHibernate 1.2 in a .NET 4.0 solution
问题描述
我有一个基于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屋!