NHibernate 1.2 в решении .NET 4.0 - PullRequest
12 голосов
/ 21 июля 2010

У меня есть несколько проектов на основе NHibernate 1.2, и я хотел бы добавить их в решение .NET 4.0, но я получаю исключение AmbiguousMatchException.
Независимо от того, нацелены ли эти проекты на 2.0 или 4.0 рамки.
Это работает, если я добавлю их в решение .NET 3.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()]

Ответы [ 2 ]

14 голосов
/ 26 июля 2010

После комментария Рупа я решил изменить источники Castle DynamicProxy 1.1.5 и перекомпилировать.
Проблема заключается в отражении метода System.Threading.Monitor.Enter с отражением без указания аргументов (это потому, что в .NET 2.0 имеется только 1 подпись), но, начиная с .NET 4.0, этот метод имеет 2 перегрузки.

Я изменил класс Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.LockBlockExpression, изменив строку

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

со строкой

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

Я получил исходники NHibernate 1.2 от SourceForge , пока я разобрал код Castle DynamicProxy 1.1.5 с помощью Reflector.

3 голосов
/ 21 июля 2010

NHibernate 1.x полностью не поддерживается на данный момент.Вы должны обновить хотя бы до 2.1.2.

В любом случае из сообщения об ошибке ясно, что проблема не в самом NHibernate, а в Castle DynamicProxy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...