2011-07-07 30 views
7

Tôi có thư viện của bên thứ ba yêu cầu lắp ráp A khi tôi gọi vào mã của họ. Hội đồng đó thường được cài đặt trong GAC, vì vậy tôi có một số tùy chọn để tải nó:Tôi nên bắt buộc tải một assembly được tham chiếu như thế nào?

  1. Tôi có thể gọi rõ ràng Assembly.Load(). Tuy nhiên, yêu cầu tên đầy đủ mà tôi không cảm thấy thoải mái với mã cứng trong chương trình của tôi.
  2. Tôi có thể gọi một cách rõ ràng Assembly.LoadWithPartialName(). Đó là một API lỗi thời, tất nhiên tôi không cảm thấy thoải mái khi mất quyền kiểm soát trong phiên bản.
  3. Tôi có thể tham khảo bản lắp ráp trong tệp dự án Visual Studio của mình, vì vậy tôi luôn nhận được phiên bản mà tôi đã tạo. Tuy nhiên, điều đó sẽ không hoạt động trừ khi tôi tạo một đối tượng giả trong assembly đó. Trình biên dịch C# chỉ đơn giản là bỏ qua nó nếu tôi không.
  4. Cùng một vấn đề nếu tôi gọi Assembly.GetReferencedAssemblies và buộc tải kết quả phù hợp. Trình biên dịch C# đơn giản sẽ không tham chiếu đến assembly của tôi ngay cả khi tôi đặt nó trong danh sách tham khảo.

Bây giờ những gì tôi đang làm là gọi typeof(A.Foo).Assembly.GetName() và bỏ qua giá trị trả lại. Có cách nào tốt hơn để làm điều đó không?

+0

Làm thế nào về tùy chọn # 1 nhưng đặt tên đầy đủ hội trong app.config (hoặc cấu hình tương tự khác tập tin)? Bằng cách đó bạn có được tốt nhất của cả hai thế giới: - một tải trọng rõ ràng của hội đồng bạn muốn, nhưng sự linh hoạt để cập nhật mà không cần biên dịch lại, bạn cần phải – dkackman

+0

@dkackman - đó là điều tôi cần cập nhật theo cách thủ công. Tôi muốn Visual Studio để nhận phiên bản hiện tại từ điều khiển phiên bản, vì vậy tôi nhận được phiên bản tại thời gian xây dựng, thay vì mã hóa thời gian hoặc thời gian chạy. –

+0

@focey - hmmm, có mùi tanh nhưng ... sau khi xây dựng? có được lắp ráp, phiên bản ferret ra, ghi vào tập tin cấu hình? Có lẽ tốt nhất để chỉ tiếp tục làm những gì bạn đang làm mặc dù tôi không thích điều đó hoặc là – dkackman

Trả lời

1

Tùy chọn 1, đối với tôi, sẽ là tham chiếu nó trong dự án VS.

Nhưng nếu bạn muốn có một cách tiếp cận thụ động hơn, bạn có thể sử dụng trình xử lý sự kiện AppDomain.CurrentDomain.AssemblyResolve. Nó thực thi khi một assembly không cần tìm thấy trong AppDomain. Các sự kiện args sẽ cho bạn biết Hội đồng đang được tìm kiếm và bạn có thể đi lấy nó tại thời điểm đó bằng cách sử dụng Assembly.Load()

+1

Cảm ơn - rất tiếc là thư viện của bên thứ ba gọi 'AppDomain.CurrentDomain.GetAssemblies()' và ném nếu không tìm thấy yêu cầu. –

+3

@focey - đó là whack – dkackman

+0

hoàn toàn whack !! –

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