2010-07-21 10 views
12

Tengo algunos proyectos basados ​​en NHibernate 1.2 y me gustaría agregarlos a una solución .NET 4.0, pero obtengo una AmbiguousMatchException.
No importa si estos proyectos están dirigidos al marco 2.0 o 4.0.
Funciona si los agrego a una solución .NET 3.5.NHibernate 1.2 en una solución .NET 4.0

¿Alguien tiene experiencia con eso?

Aquí es la excepción:

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

Deberá depurarlo para encontrar una coincidencia ambigua de qué. Si esto es realmente algo de .NET 4, parece que Castle está usando el método de reflexión para buscar un método .NET específico en el tiempo de ejecución sin una lista de argumentos y que .NET 4 ahora proporciona múltiples sobrecargas de ese método (!). Si puede depurar en NHibernate y/o Castle (es decir, si tiene PDB, o si los construyó usted mismo), esto debería ser bastante sencillo. – Rup

+0

Rup, tienes razón. He visto en [1] que Castle está buscando Monitor.Enter, pero desde .NET 4.0 ese método tiene 2 firmas. No puedo encontrar las fuentes de Castle DynamicProxy 1.1.5, no puedo volver a compilarlo. Gracias de todos modos. [1] http://www.symbolsource.org/Public/Metadata/Project/Castle/1.0-RC3/Debug/All/Castle.DynamicProxy/Castle.DynamicProxy/Builder/CodeBuilder/SimpleAST/LockBlockExpression.cs – ssambi

+1

usted puede obtener el código antiguo de Castle aquí: http://github.com/castleproject/castle –

Respuesta

14

Siguiendo el comentario de Rup, resolví cambiar las fuentes de Castle DynamicProxy 1.1.5 y volver a compilar.
El problema es invocar con reflexión el método System.Threading.Monitor.Enter sin especificar argumentos (porque en .NET 2.0 solo hay 1 firma), pero desde .NET 4.0 ese método tiene 2 sobrecargas.

He modificado el Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.LockBlockExpression clase, el cambio de la fila

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

con la fila

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

Tengo las fuentes de NHibernate 1.2 from SourceForge mientras desarmé el código de Castle DynamicProxy 1.1.5 con Reflector.

+0

debes aceptar esta respuesta. –

+0

Acepté la respuesta, gracias Mauricio – ssambi

+1

Tengo la fuente actual de 1.1.5 en una sucursal de proveedor en mi repositorio SVN y la publiqué en respuesta a una pregunta en una lista de correo aquí. Sin garantías :) http://groups.google.com/group/mybatisnet-user/browse_thread/thread/a60a0b5fd29a1ff9 –

3

NHibernate 1.x es completamente no soportado en este punto. Debe actualizar al menos a 2.1.2.

En cualquier caso, está claro en el mensaje de error que el problema no está en NHibernate en sí, sino en Castle DynamicProxy.

+0

El problema no es con el antiguo DP en sí mismo. Es viejo DP (creado para .net 1.1) ejecutándose en .NET 4 :) –

+0

Sí, eso es lo que pensé :-) –