NHibernate 1.2在.NET 4.0解决方案中

NHibernate 1.2在.NET 4.0解决方案中,nhibernate,.net-4.0,Nhibernate,.net 4.0,我有一些基于NHibernate 1.2的项目,我想将它们添加到.NET 4.0解决方案中,但我得到一个模糊的MatchException。 无论这些项目是针对2.0还是4.0框架。 如果我将它们添加到.NET3.5解决方案中,它就会起作用 有人有这方面的经验吗 例外情况如下: [AmbiguousMatchException: Ambiguous match found.] System.RuntimeType.GetMethodImpl(String name, BindingFlag

我有一些基于NHibernate 1.2的项目,我想将它们添加到.NET 4.0解决方案中,但我得到一个模糊的MatchException。
无论这些项目是针对2.0还是4.0框架。
如果我将它们添加到.NET3.5解决方案中,它就会起作用

有人有这方面的经验吗

例外情况如下:

[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()]

NHibernate 1.x目前完全不受支持。您应该至少升级到2.1.2


在任何情况下,从错误消息中可以清楚地看出,问题不在NHibernate本身,而在Castle DynamicProxy中。

根据Rup的评论,我决定更改Castle DynamicProxy 1.1.5的源代码并重新编译。
问题是使用反射调用方法System.Threading.Monitor.Enter而不指定参数(这是因为在.NET 2.0中只有1个签名),但由于.NET 4.0,该方法有2个重载

我修改了Castle.DynamicProxy.Builder.CodeBuilder.SimpleEast.LockBlockExpression类,更改了行

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

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

我已经得到了NHibernate 1.2的源代码,同时我用Reflector反汇编了Castle DynamicProxy 1.1.5的代码

您需要对其进行调试,以找出不明确的匹配项。如果这确实是一个.NET 4问题,那么Castle似乎在运行时使用反射来查找特定的.NET方法,而没有参数列表,并且.NET 4现在提供了该方法的多个重载(!)。如果您可以调试到NHibernate和/或Castle(即,如果您有PDB,或者如果您自己构建它们),这应该是相当简单的。我在[1]中看到Castle正在查找Monitor.Enter,但在.NET4.0中,该方法有2个签名。我找不到Castle DynamicProxy 1.1.5的源代码,无法重新编译。无论如何,谢谢你。[1] 您可以在这里获得Castle的旧代码:问题不在于旧DP本身。它是在.NET4上运行的旧DP(为.NET1.1构建):)是的,这就是我的想法:-)我在我的SVN存储库中的一个供应商分支中有实际的1.1.5源代码,并在这里发布它以回答邮件列表中的一个问题。没有保证:)这对我也有效,并真正拯救了我们的培根(有一个依赖DynamicProxy的第三方DLL),同样的解决方案对我适用于iBATIS1.6,它使用Castle.DynamicProxy。一个非常有用的答案——谢谢。