2010-07-21 25 views
12

Tôi có một số dự án dựa trên NHibernate 1.2 và tôi muốn thêm chúng vào một giải pháp .NET 4.0, nhưng tôi nhận được một AmbiguousMatchException.
Không có vấn đề gì nếu các dự án này được nhắm mục tiêu đến khung 2.0 hoặc 4.0.
Nó hoạt động nếu tôi thêm chúng vào một giải pháp .NET 3.5.NHibernate 1.2 trong một giải pháp .NET 4.0

Có ai có kinh nghiệm với điều đó không?

Đây là ngoại lệ:

[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

Bạn sẽ cần phải gỡ lỗi để tìm ra một kết quả không rõ ràng về những gì. Nếu điều này thực sự là một điều .NET 4, có vẻ như Castle đang sử dụng sự phản chiếu để tìm kiếm một phương thức .NET cụ thể trong thời gian chạy mà không có danh sách arg và .NET 4 giờ đây cung cấp nhiều quá tải của phương thức đó (!). Nếu bạn có thể gỡ lỗi vào NHibernate và/hoặc Castle (nghĩa là nếu bạn đã có PDB, hoặc nếu bạn tự xây dựng chúng), điều này sẽ khá đơn giản. – Rup

+0

Rup, bạn nói đúng. Tôi đã thấy rằng Castle đang tra cứu Monitor.Enter, nhưng từ .NET 4.0, phương thức này có 2 chữ ký. Tôi không thể tìm thấy nguồn của Castle DynamicProxy 1.1.5, tôi không thể biên dịch lại nó. Cảm ơn bạn anyway. [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

bạn có thể lấy mã cũ của Castle ở đây: http://github.com/castleproject/castle –

Trả lời

14

Theo nhận xét của Rup, tôi đã giải quyết thay đổi nguồn của Castle DynamicProxy 1.1.5 và biên dịch lại.
Vấn đề được gọi bằng cách phản ánh phương thức System.Threading.Monitor.Enter mà không chỉ rõ các đối số (đó là vì trong .NET 2.0 chỉ có 1 chữ ký), nhưng vì .NET 4.0 có phương thức 2 quá tải.

Tôi đã sửa đổi các Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.LockBlockExpression lớp, thay đổi hàng

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

với hàng

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

Tôi đã có các nguồn NHibernate 1.2 from SourceForge trong khi tôi tháo rời mã của Castle DynamicProxy 1.1.5 bằng Reflector.

+0

bạn nên chấp nhận câu trả lời này. –

+0

Tôi đã chấp nhận câu trả lời, cảm ơn bạn Mauricio – ssambi

+1

Tôi có nguồn 1.1.5 thực tế trong chi nhánh nhà cung cấp trong kho SVN của tôi và đăng nó để trả lời câu hỏi trong danh sách gửi thư ở đây. Không đảm bảo :) http://groups.google.com/group/mybatisnet-user/browse_thread/thread/a60a0b5fd29a1ff9 –

3

NHibernate 1.x là hoàn toàn không được hỗ trợ vào thời điểm này. Bạn nên nâng cấp ít nhất lên 2.1.2.

Trong mọi trường hợp, rõ ràng từ thông báo lỗi rằng sự cố không có trong chính NHibernate, nhưng trong Castle DynamicProxy.

+0

Vấn đề không phải với chính DP cũ. Đó là DP cũ (được xây dựng cho .net 1.1) chạy trên .NET 4 :) –

+0

Yup, đó là những gì tôi nghĩ :-) –

Các vấn đề liên quan