2009-07-10 30 views
18

Có thể bắt ngoại lệ khi không tìm thấy một tham chiếu .dll không?Tôi có thể gặp lỗi dll thiếu trong khi tải ứng dụng trong C# không?

Ví dụ: tôi có dự án C# có tham chiếu đến dll của bên thứ ba; nếu dll đó không thể được tìm thấy, một ngoại lệ được ném. Ngoại lệ là một System.IO.FileNotFoundException, nhưng tôi không thể xác định nơi để bắt nó. Các mã sau đây dường như không làm việc:

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     try 
     { 
      // code goes here 
     } 
     catch (Exception exc) 
     { 
      MessageBox.Show(exc.ToString()); 
     } 
    } 
} 

Trả lời

32

Mở rộng câu trả lời của Josh.

Các cụm trong .Net được nạp theo yêu cầu của CLR. Thông thường một tải lắp ráp sẽ không được cố gắng cho đến khi một phương pháp là JIT'd trong đó sử dụng một loại từ hội đồng đó.

Nếu bạn không thể bắt gặp lỗi tải lắp ráp với khối try/catch trong phương thức chính, có khả năng là bạn đang sử dụng loại từ assembly trong try/catch. Vì vậy, ngoại lệ xảy ra trước khi phương pháp chính thực sự chạy.

Thử đặt tất cả mã từ phương thức chính vào một chức năng khác. Sau đó gọi hàm đó trong khối try/catch và bạn sẽ thấy ngoại lệ.

+0

Sự tinh tế này là những gì tôi đã bỏ lỡ. Cảm ơn nhiều. –

29

Bạn có thể sử dụng AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
    } 

Để tự tìm việc lắp ráp nếu nó không thể tìm thấy nó automaticaly.

+2

Đây là một mẹo tuyệt vời, ngay cả khi nó không được chấp nhận làm câu trả lời. –

+2

đây là giải thích chi tiết hơn http://www.codeproject.com/Articles/310675/AppDomain-AssemblyResolve-Event-Tips – Guntis

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