2009-09-22 5 views
11

Tôi có một số ứng dụng .NET trong C#, cùng với một API để chúng truy cập cơ sở dữ liệu. Tôi muốn đặt tất cả các phiên bản của API trong cơ sở dữ liệu và yêu cầu họ chọn số sửa đổi và xây dựng cao nhất, nhưng gắn bó với số lượng lớn và nhỏ mà họ đã xây dựng. Về cơ bản khi tôi tham khảo API 1.2.3.4 Tôi muốn tham khảo để đọc 1.2.*.* để các ứng dụng chỉ cần nhận 1.2.3.5 Tôi thấy tôi có thể làm điều này với các tệp cấu hình XML. Tôi muốn có nó tuân thủ. Tương tự như các chính sách xuất bản, nhưng với ra các tập tin bổ sung. Tôi có thể giải quyết cho điều đó. Vấn đề khác là tất cả các giải pháp tôi thấy chuyển hướng một phiên bản sang một phiên bản cụ thể khác, không chỉ cho bất kỳ phiên bản mới hơn.Cách sử dụng Assembly Binding Redirection để bỏ qua sửa đổi và xây dựng số

Làm cách nào để thực hiện việc này?

Ai đó có thể chỉ cho tôi nguồn thông tin về chính sách dành cho nhà xuất bản không?

Trả lời

5

AppDomain.AssemblyResolve sự kiện sẽ hữu ích.

25

Nhờ leppie's suggestion sử dụng sự kiện AppDomain.AssemblyResolve, tôi đã có thể giải quyết một vấn đề tương tự. Đây là những gì mã của tôi trông giống như:

public void LoadStuff(string assemblyFile) 
    { 
     AppDomain.CurrentDomain.AssemblyResolve += 
      new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
     var assembly = Assembly.LoadFrom(assemblyFile); 

     // Now load a bunch of types from the assembly... 
    } 

    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var name = new AssemblyName(args.Name); 
     if (name.Name == "FooLibrary") 
     { 
      return typeof(FooClass).Assembly; 
     } 
     return null; 
    } 

này hoàn toàn bỏ qua các số phiên bản và thay thế các thư viện đã được nạp cho bất kỳ tài liệu tham khảo thư viện có tên là "FooLibrary". Bạn có thể sử dụng các thuộc tính khác của lớp AssemblyName nếu bạn muốn hạn chế hơn. FooClass có thể là bất kỳ lớp nào trong hội đồng FooLibrary.

+1

Tôi đang cố gắng thực hiện điều này trong ngữ cảnh của ứng dụng ASP.NET. Tôi có thể móc vào sự kiện AppDomain.CurrentDomain.AssemblyResolve ở đâu? Ở cấp độ sự kiện của ứng dụng (tức là global.asax)? –

+0

Tôi nghĩ bạn có thể đăng ký sự kiện 'AssemblyResolve' từ bất cứ đâu. Không có gì đặc biệt về phương thức 'LoadStuff()'. Nếu bạn quyết định đăng ký cho sự kiện mỗi khi bạn tải một hội đồng, chỉ cần nhớ để unregister khi bạn đang thực hiện. –

+0

Người đàn ông tuyệt vời. Chính xác những gì tôi đang tìm kiếm – Jupaol