2010-07-21 3 views
12

में एनएचबर्ननेट 1.2 मेरे पास एनएचबीरनेट 1.2 पर आधारित कुछ परियोजनाएं हैं और मैं उन्हें .NET 4.0 समाधान में जोड़ना चाहता हूं, लेकिन मुझे एक अस्पष्ट मैच अपवाद मिलता है।
कोई फर्क नहीं पड़ता कि इन परियोजनाओं को 2.0 या 4.0 ढांचे पर लक्षित किया गया है या नहीं।
यह काम करता है अगर मैं उन्हें .NET 3.5 समाधान में जोड़ता हूं।एनएचईटी 4.0 समाधान

क्या किसी के पास इसका अनुभव है?

[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 चीज है, तो ऐसा लगता है जैसे कैसल एक विशिष्ट सूची के बिना रनटाइम में एक विशिष्ट .NET विधि को देखने के लिए प्रतिबिंब का उपयोग कर रहा है और .NET 4 अब उस विधि (!) के एकाधिक अधिभार प्रदान करता है। यदि आप एनएचबीरनेट और/या कैसल में डीबग कर सकते हैं (यानी यदि आपको पीडीबी मिल गया है, या यदि आपने उन्हें स्वयं बनाया है) यह काफी सरल होना चाहिए। – Rup

+0

रुपए, आप सही हैं। मैंने [1] में देखा है कि कैसल मॉनिटर देख रहा है। अंदर, लेकिन .NET 4.0 से उस विधि में 2 हस्ताक्षर हैं। मैं कैसल डायनैमिक प्रॉक्सी 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

रुपए की टिप्पणी के बाद, मैंने कैसल डायनैमिक प्रॉक्सी 1.1.5 के स्रोतों को बदलने और पुन: संकलित करने का संकल्प किया।
समस्या विधि प्रणाली को प्रतिबिंबित करने के साथ आ रही है। थ्रेडिंग। मॉनिटर। तर्क निर्दिष्ट किए बिना दर्ज करें (ऐसा इसलिए है क्योंकि .NET 2.0 में केवल 1 हस्ताक्षर है), लेकिन .NET 4.0 के बाद से विधि 2 अधिभार है।

मैं कक्षा Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.LockBlockExpression संशोधित कर लिया है, पंक्ति

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

मैं NHibernate के स्रोतों मिल गया है के साथ पंक्ति

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

बदलते 1.2 from SourceForge जबकि मैंने प्रतिबिंबक के साथ कैसल डायनैमिक प्रॉक्सी 1.1.5 के कोड को अलग किया।

+0

आपको यह जवाब स्वीकार करना चाहिए। –

+0

मैंने जवाब स्वीकार कर लिया है, धन्यवाद मॉरिसियो – ssambi

+1

मेरे पास मेरे एसवीएन भंडार में एक विक्रेता शाखा में वास्तविक 1.1.5 स्रोत है और इसे यहां मेलिंग सूची पर एक प्रश्न के जवाब में पोस्ट किया गया है। कोई गारंटी नहीं :) http://groups.google.com/group/mybatisnet-user/browse_thread/thread/a60a0b5fd29a1ff9 –

3

NHibernate 1.x इस बिंदु पर पूरी तरह से असमर्थित है:

यहाँ अपवाद नहीं है। आपको कम से कम 2.1.2 अपग्रेड करना चाहिए।

किसी भी मामले में, यह त्रुटि संदेश से स्पष्ट है कि समस्या NHBernate में नहीं है, लेकिन कैसल डायनामिकप्रॉक्सी में है।

+0

समस्या पुराने डीपी के साथ नहीं है। यह पुराना डीपी (नेट 1.1 के लिए बनाया गया है) .NET 4 पर चल रहा है :) –

+0

यूप, यही मैंने सोचा था :-) –