Làm thế nào để lấy thuộc tính LoaderException?


128

Tôi nhận được thông báo lỗi trong khi cập nhật tham chiếu dịch vụ của mình:

Cảnh báo công cụ tùy chỉnh: Không thể tải một hoặc nhiều loại được yêu cầu. Truy xuất thuộc tính LoaderExceptions để biết thêm thông tin.

Làm cách nào tôi có thể truy xuất thuộc tính LoaderException?

Cập nhật: Lỗi của tôi đã biến mất khi tôi nhập lại các dự án đối tượng miền. Tôi không biết tại sao điều này đã khắc phục vấn đề, nhưng tôi rất vui vì nó hoạt động.


6
Làm thế nào bạn quản lý để sửa lỗi này? Bạn có ý nghĩa gì khi "nhập lại dự án đối tượng miền"? (xóa tham chiếu đến dự án và thêm lại lần nữa?)
Nikos Tsokos

Câu trả lời:


142
try
{
  // load the assembly or type
}
catch (Exception ex)
{
  if (ex is System.Reflection.ReflectionTypeLoadException)
  {
    var typeLoadException = ex as ReflectionTypeLoadException;
    var loaderExceptions  = typeLoadException.LoaderExceptions;
  }
}

1
Tôi đánh dấu bạn là câu trả lời vì tôi nghĩ nó sẽ hữu ích nhất cho những người khác gặp phải cảnh báo / lỗi này.
rozon

3
Tôi đang cố gắng sử dụng giải pháp này, nhưng tôi không có điểm vào trong dịch vụ WCF của mình để thực sự bao bọc một khối thử.
Jordan

3
Câu trả lời này sẽ làm việc cho tôi nếu nó có liên quan đến mã của tôi. Tôi đã đặt try...catchxung quanh toàn bộ Installer.cslớp học của tôi , và không có gì! Mã của tôi không ném mã này khi nó chạy, chỉ khi tôi cố thực thi Trình cài đặt. Có ai biết Làm thế nào để truy xuất thuộc tính LoaderExceptions để biết thêm thông tin không? Giống như, duyệt đến một thư mục và xem một tập tin nhật ký?
jp2code 18/03/13

5
Mệnh đề bắt sẽ bắt tất cả các ngoại lệ nhưng chỉ xử lý ReflectionTypeLoadExceptions. Một cái gì đó như thế này sẽ tốt hơn. catch (ReflectionTypeLoadException ex) { var typeLoadException = ex as ReflectionTypeLoadException; var loaderExceptions = typeLoadException.LoaderExceptions; }
Scott Munro

1
@ScottMunro: Nếu bạn bắt nó dưới dạng một loại, tại sao lại tạo một biến khác có cùng loại và thực hiện phân vai? Điều này sẽ đủ : catch (ReflectionTypeLoadException ex) { var loaderExceptions = ex.LoaderExceptions; }. Ngoài ra, trừ khi bạn dự đoán dàn diễn viên thất bại và sẽ kiểm tra null, tốt hơn là thực hiện một vai trực tiếp để nó sẽ thất bại ngay lập tức và không muộn hơn với ngoại lệ tham chiếu null:var typeLoadException = (ReflectionTypeLoadException)ex;
Nelson Rothermel

74
catch (ReflectionTypeLoadException ex)
{        
    foreach (var item in ex.LoaderExceptions)
    {
          MessageBox.Show(item.Message);                    
    }
}

Tôi xin lỗi vì đã phục hồi một luồng cũ, nhưng muốn đăng một giải pháp khác để kéo ngoại lệ trình tải (Sử dụng ReflectionTypeLoadException thực tế) cho bất kỳ ai khác gặp phải điều này.


2
Chỉ là một FYI, nếu bạn đang chạy Dịch vụ Win (như tôi), MessageBox sẽ không xuất hiện vì các thành phần UI sẽ tự động bị chặn. Phần còn lại của việc thực hiện là hữu ích. Chỉ cần lưu vào một tệp nhật ký thay thế. Cảm ơn.
Vippy

1
"Câu lệnh bắt bị thiếu khối lệnh của nó". Chúa ơi, tôi ghét powershell.

Rất cám ơn, giải pháp này là chính xác vì nó xác định chính xác vấn đề. Không có điểm trong việc bắt ngoại lệ và không làm gì cả.
Muhammad Ashhar Hasan

5

Sử dụng Quick Watch trong Visual Studio, bạn có thể truy cập LoaderExceptions từ ViewDetails của ngoại lệ bị ném như thế này:

($exception).LoaderExceptions

Cảm ơn! Làm cho tôi tự hỏi tại sao không bao gồm thông tin đó mà không cần phải truy cập LoaderExceptions, vì nó thực sự chứa thông tin liên quan.
GuiRitter

0

Một lựa chọn khác cho những người đang thăm dò và / hoặc trong chế độ tương tác:

$ Lỗi [0] .Exception.LoaderExceptions

Lưu ý: [0] lấy Lỗi gần đây nhất từ ​​ngăn xếp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.