Bagaimana cara mengambil properti LoaderException?

128

Saya mendapatkan pesan kesalahan saat memperbarui referensi layanan saya:

Peringatan alat khusus: Tidak dapat memuat satu atau beberapa jenis yang diminta. Ambil properti LoaderExceptions untuk informasi lebih lanjut.

Bagaimana saya bisa mengambil properti LoaderException?

Pembaruan: Kesalahan saya hilang ketika saya mengimpor kembali proyek objek domain. Saya tidak tahu mengapa ini memperbaiki masalah ini, tetapi saya senang ini berhasil.

rozon
sumber
6
Bagaimana Anda bisa memperbaikinya? Apa yang Anda maksud dengan "mengimport ulang proyek objek domain"? (hapus referensi ke proyek dan tambahkan lagi?)
Nikos Tsokos

Jawaban:

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;
  }
}
KBoek
sumber
1
Saya menandai Anda sebagai jawaban karena saya pikir ini akan sangat membantu bagi orang lain yang mengalami peringatan / kesalahan ini.
rozon
3
Saya mencoba menggunakan solusi ini, tetapi saya tidak memiliki titik masuk di layanan WCF saya untuk benar-benar membungkus blok percobaan.
Jordan
3
Jawaban ini akan bekerja untuk saya jika ada hubungannya dengan kode saya. Saya telah menempatkan try...catchseluruh Installer.cskelas saya , dan tidak ada! Kode saya tidak membuang ini saat dijalankan, hanya ketika saya mencoba menjalankan Installer. Adakah yang tahu Cara Mengambil properti LoaderExceptions untuk informasi lebih lanjut? Suka, browse ke folder dan melihat file log?
jp2code
5
Klausa tangkapan akan menangkap semua pengecualian tetapi hanya menangani ReflectionTypeLoadExceptions. Sesuatu seperti ini akan lebih baik. catch (ReflectionTypeLoadException ex) { var typeLoadException = ex as ReflectionTypeLoadException; var loaderExceptions = typeLoadException.LoaderExceptions; }
Scott Munro
1
@ScottMunro: Jika Anda menangkapnya sebagai satu tipe, mengapa membuat variabel lain dengan tipe yang sama dan melakukan casting? Ini harus cukup: catch (ReflectionTypeLoadException ex) { var loaderExceptions = ex.LoaderExceptions; }. Juga, kecuali jika Anda mengharapkan para pemain gagal dan akan memeriksa nol, lebih baik untuk melakukan para pemain langsung sehingga akan gagal segera dan tidak nanti dengan pengecualian referensi nol:var typeLoadException = (ReflectionTypeLoadException)ex;
Nelson Rothermel
74
catch (ReflectionTypeLoadException ex)
{        
    foreach (var item in ex.LoaderExceptions)
    {
          MessageBox.Show(item.Message);                    
    }
}

Saya minta maaf karena menghidupkan kembali utas lama, tetapi ingin memposting solusi yang berbeda untuk menarik pengecualian loader (Menggunakan ReflectionTypeLoadException yang sebenarnya) untuk orang lain yang menemukan ini.

Yakub Saylor
sumber
2
Hanya FYI, jika Anda menjalankan Layanan Win (seperti saya), MessageBox tidak akan muncul karena elemen UI diblokir secara otomatis. Sisa implementasi sangat membantu. Hanya disimpan ke file log saja. Terima kasih.
Vippy
1
+ Msgstr "Pernyataan tangkap tidak ada blok pernyataannya". Ya Tuhan, aku benci PowerShell.
Burung hantu
Terima kasih banyak, solusi ini akurat karena menunjukkan masalah yang sebenarnya. Tidak ada gunanya menangkap pengecualian dan tidak melakukan apa pun.
Muhammad Ashhar Hasan
5

Menggunakan Quick Watch di Visual Studio Anda dapat mengakses LoaderExceptions dari ViewDetails dari pengecualian yang dilemparkan seperti ini:

($exception).LoaderExceptions
hugo4711
sumber
Terima kasih! Buat saya bertanya-tanya mengapa tidak memasukkan informasi itu tanpa perlu mengakses LoaderExceptions, karena sebenarnya berisi informasi yang relevan.
GuiRitter
0

Alternatif lain untuk mereka yang menyelidik dan / atau dalam mode interaktif:

$ Error [0] .Exception.LoaderExceptions

Catatan: [0] mengambil Kesalahan terbaru dari tumpukan

techsaint
sumber