2011-07-27 27 views
6

Ứng dụng của tôi chứa tham chiếu đến thư viện bên ngoài (đối tượng quản lý máy chủ SQL). Rõ ràng, nếu thư viện không có mặt trên hệ thống thời gian chạy, ứng dụng vẫn hoạt động miễn là không có phương thức nào được gọi là sử dụng các lớp từ thư viện này.Làm cách nào để phát hiện tham chiếu .NET thiếu trong thời gian chạy?

Câu hỏi 1: Hành vi được chỉ định này hay chỉ là tác dụng phụ (may mắn) của cách CLR tải thư viện?

Để phát hiện xem các tài liệu tham khảo có thể truy cập, tôi hiện đang sử dụng mã như thế này:

Function IsLibraryAvailable() As Boolean 
    Try 
     TestMethod() 
    Catch ex As FileNotFoundException 
     Return False 
    End Try 
    Return True 
End Function 

Sub TestMethod() 
    Dim srv As New Smo.Server() ' Try to create an object in the library 
End Sub 

Nó hoạt động, nhưng nó có vẻ là khá xấu xí. Lưu ý rằng nó chỉ hoạt động nếu TestMethod là một phương thức riêng biệt, nếu không ngoại lệ sẽ được ném tại số bắt đầu của IsLibraryAvailable (trước khi thử, ngay cả khi đối tượng khởi tạo xảy ra trong khối try-catch).

Câu hỏi 2: Có phương án nào tốt hơn không?

Đặc biệt, tôi e rằng các tối ưu hóa như nội tuyến chức năng có thể khiến mã của tôi không hoạt động.

+1

Những thứ kích hoạt biên dịch động (và những thứ tương tự) có thể khiến mã dường như không liên quan đến thất bại khi không có thư viện. Ví dụ, serialization/deserialization, tính năng ASP.NET Profile đã thất bại đối với tôi khi một hội đồng tham chiếu dường như không liên quan bị thiếu. Nó tạo ra rất, rất khó để gỡ lỗi các vấn đề. – MatthewMartin

+0

@MatthewMartin: Cảm ơn, đó là điều tốt để biết. – Heinzi

Trả lời

4

Điều đó được mong đợi, vì JIT lười ở mức cho mỗi phương thức. Lưu ý rằng nội tuyến không phải là một vấn đề ở đây, vì đó cũng là một mối quan tâm JIT, không phải là một mối quan tâm của trình biên dịch.

lựa chọn tốt hơn:

  • chắc chắn rằng các ứng dụng đã được cài đặt với tất cả mọi thứ nó cần
  • sử dụng ILMerge hoặc tương tự để tạo ra một hội duy nhất (nếu có thể)

Cá nhân, tôi muốn chỉ cần sử dụng tùy chọn đầu tiên.

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