2010-07-21 2 views
12

NHibernate 1.2를 기반으로하는 몇 가지 프로젝트가 있으며이를 .NET 4.0 솔루션에 추가하고 싶습니다. 그러나 AmbiguousMatchException이 발생합니다.
이 프로젝트가 2.0 또는 4.0 프레임 워크를 대상으로하는지 여부에 관계없이
.NET 3.5 솔루션에 추가하면 작동합니다..NET 4.0 솔루션에서 NHibernate 1.2

누구나 그 경험이 있습니까?

[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

무엇을 모호하게 일치 시키려면 디버깅해야합니다. 이것이 실제로 .NET 4 일 경우, Castle이 리플렉션을 사용하여 런타임에 arg 목록없이 특정 .NET 메소드를 조회하고 .NET 4가 해당 메소드 (!)의 다중 오버로드를 제공하는 것처럼 들립니다. NHibernate 및/또는 Castle으로 디버깅 할 수 있다면 (즉, PDB가 있거나 직접 구축 한 경우) 이것은 매우 간단해야합니다. – Rup

+0

Rup, 네 말이 맞아. Castle이 Monitor.Enter를 찾고 있다고 [1]에서 보았습니다. 그러나 .NET 4.0에서이 메소드에는 2 개의 서명이 있습니다. Castle DynamicProxy 1.1.5의 소스를 찾을 수 없습니다. 다시 컴파일 할 수 없습니다. 어쨌든 고맙습니다. [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

당신 성의 예전 코드를 여기에서 얻을 수 있습니다 : http://github.com/castleproject/castle –

답변

14

Rup의 의견에 이어 Castle DynamicProxy 1.1.5의 소스를 변경하고 다시 컴파일하기로 결심했습니다.
문제는 .NET Framework 2.0에서 1 개의 서명 만 있기 때문에 (즉, .NET 2.0에 2 개의 오버로드가 있기 때문에) 인수를 지정하지 않고 System.Threading.Monitor.Enter 메서드를 리플렉션하여 호출하는 것입니다.

은 내가 NHibernate에의 소스를 가지고

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

행과 행

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

을 변경, 클래스 Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.LockBlockExpression을 수정 한 1.2 from SourceForge Reflector를 사용하여 Castle DynamicProxy 1.1.5의 코드를 분해하는 동안.

+0

이 대답을 받아 들여야합니다. –

+0

답변을 수락했습니다. Mauricio – ssambi

+1

SVN 저장소의 공급 업체 지점에있는 실제 1.1.5 소스가 있고 메일 링리스트에있는 질문에 대한 응답으로 게시했습니다. 보장 없음 :) http://groups.google.com/group/mybatisnet-user/browse_thread/thread/a60a0b5fd29a1ff9 –

3

NHibernate에 1.x의이 시점에서 전혀 지원되지 : 여기

예외이다. 최소한 2.1.2로 업그레이드해야합니다.

어쨌든, 문제는 NHibernate 자체가 아니라 Castle DynamicProxy에 있음을 알리는 오류 메시지가 분명합니다.

+0

문제는 이전 DP 자체가 아닙니다. 이전 DP (.net 1.1 용으로 빌드되었습니다.) .NET 4에서 실행 중입니다. –

+0

그래, 그게 내가 생각한 것 :-) –