2010-07-21 16 views
12

Mam kilka projektów opartych na NHibernate 1.2 i chciałbym dodać je do rozwiązania .NET 4.0, ale dostaję wyjątek AmbiguousMatchException.
Nie ma znaczenia, czy projekty te są ukierunkowane na środowisko 2.0 czy 4.0.
Działa, jeśli dodaję je do rozwiązania .NET 3.5.NHibernate 1.2 w rozwiązaniu .NET 4.0

Czy ktoś ma z tym doświadczenie?

Oto wyjątek:

[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

Musisz go zdebugować, aby znaleźć niejednoznaczny odpowiednik. Jeśli to naprawdę jest .NET 4, to wygląda na to, że Castle używa odbicia, aby wyszukać konkretną metodę .NET w środowisku wykonawczym bez listy argumentów i że .NET 4 zapewnia teraz wiele przeciążeń tej metody (!). Jeśli możesz przeprowadzić debugowanie w NHibernate i/lub Castle (tj. Jeśli masz PDB lub sam je zbudowałeś), powinno to być całkiem proste. – Rup

+0

Rup, masz rację. Widziałem w [1], że Castle patrzy w górę Monitor.Enter, ale z .NET 4.0 ta metoda ma 2 podpisy. Nie mogę znaleźć źródeł CastleProxyProxy 1.1.5, nie mogę go przekompilować. Mimo wszystko dziekuję. [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

ty można uzyskać stary kod Castle'a tutaj: http://github.com/castleproject/castle –

Odpowiedz

14

Po komentarzu Rupa, postanowiłem zmienić źródła Castle DynamicProxy 1.1.5 i rekompilować.
Problem polega na wywołaniu z odbiciem metody System.Threading.Monitor.Enter bez określania argumentów (to dlatego, że w .NET 2.0 jest tylko 1 podpis), ale od .NET 4.0 ta metoda ma 2 przeciążenia.

Mam zmodyfikowano Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.LockBlockExpression klasy, zmieniając wiersz

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

z rzędu

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

Mam źródeł NHibernate 1.2 from SourceForge a ja zdemontowałem kod Castle DynamicProxy 1.1.5 z Reflectorem.

+0

powinieneś przyjąć tę odpowiedź. –

+0

Przyjąłem odpowiedź, dziękuję Mauricio – ssambi

+1

Mam aktualne źródło 1.1.5 w oddziale dostawcy w moim repozytorium SVN i opublikowałem go w odpowiedzi na pytanie na liście dyskusyjnej tutaj. Brak gwarancji :) http://groups.google.com/group/mybatisnet-user/browse_thread/thread/a60a0b5fd29a1ff9 –

3

NHibernate 1.x zupełnie niepodparta na tym etapie. Powinieneś uaktualnić przynajmniej do wersji 2.1.2.

W każdym razie z komunikatu o błędzie wynika, że ​​problem nie występuje w NHibernate, ale w Castle DynamicProxy.

+0

Problem nie dotyczy starego DP. To stary DP (zbudowany dla .net 1.1) działający na .NET 4 :) –

+0

Tak, tak właśnie myślałem :-) –

Powiązane problemy