LoaderException özelliği nasıl alınır?


128

Servis referansımı güncellerken bir hata mesajı alıyorum:

Özel araç uyarısı: İstenen türlerden biri veya daha fazlası yüklenemiyor. Daha fazla bilgi için LoaderExceptions özelliğini alın.

LoaderException özelliğini nasıl alabilirim?

Güncelleme: Etki alanı nesnesi projelerini yeniden içe aktardığımda hatalarım kayboldu. Bunun neden sorunu çözdüğüne dair hiçbir fikrim yok, ancak işe yaradığına sevindim.


6
Bunu nasıl çözdünüz? "Etki alanı nesnesini yeniden içe aktarma projesi" ile neyi kastediyorsunuz? (projeyle ilgili referansı kaldırıp tekrar ekleyelim mi?)
Nikos Tsokos 01

Yanıtlar:


143
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
Sizi yanıt olarak işaretledim çünkü bu uyarıyı / hatayı yaşayan diğer kişiler için çok yararlı olacağını düşünüyorum.
rozon

3
Bu çözümü kullanmaya çalışıyorum, ancak WCF hizmetimde gerçekten bir try bloğunu saracağım bir giriş noktam yok.
Jordan

3
Kodumla bir ilgisi olsaydı, bu cevap benim için işe yarar. try...catchTüm Installer.cssınıfımın etrafına bir yerleştirdim ve hiçbir şey yapmadım! Kodum çalıştığında bunu fırlatmıyor, sadece Yükleyiciyi çalıştırmaya çalıştığımda. Daha fazla bilgi için LoaderExceptions özelliğini nasıl alacağını bilen var mı ? Mesela bir klasöre göz atın ve bir günlük dosyasını görüntüleyin.
jp2code

5
Catch yan tümcesi tüm istisnaları yakalar ancak yalnızca ReflectionTypeLoadExceptions öğesini ele alır. Böyle bir şey daha iyi olur. catch (ReflectionTypeLoadException ex) { var typeLoadException = ex as ReflectionTypeLoadException; var loaderExceptions = typeLoadException.LoaderExceptions; }
Scott Munro

1
@ScottMunro: Eğer onu bir tür olarak yakalıyorsanız, neden aynı türde başka bir değişken oluşturup bir cast yapalım? Bu yeterli olacaktır: catch (ReflectionTypeLoadException ex) { var loaderExceptions = ex.LoaderExceptions; }. Ayrıca, oyuncunun başarısız olmasını beklemediğiniz ve boş olup olmadığını kontrol etmediğiniz sürece, doğrudan bir cast yapmak daha iyidir, böylece hemen başarısız olur ve daha sonra boş bir referans istisnası ile başarısız olur:var typeLoadException = (ReflectionTypeLoadException)ex;
Nelson Rothermel

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

Eski bir iş parçacığını yeniden canlandırdığım için üzgünüm, ancak başka birinin bununla karşılaşması için yükleyici istisnasını (gerçek ReflectionTypeLoadException kullanarak) çekmek için farklı bir çözüm göndermek istedim.


2
Bilginize, eğer bir Win Hizmeti çalıştırıyorsanız (benim gibi), UI öğeleri otomatik olarak engellendiği için MessageBox görünmeyecektir. Uygulamanın geri kalanı yardımcı oldu. Bunun yerine bir günlük dosyasına kaydedildi. Teşekkürler.
Vippy

1
"Catch deyiminin ifade bloğu eksik". Tanrım, Powerershell'den nefret ediyorum.
Owl

Çok teşekkürler, bu çözüm, sorunu tam olarak belirlediği için doğrudur. İstisnayı yakalamanın ve hiçbir şey yapmanın anlamı yok.
Muhammed Ashhar Hasan

5

Visual Studio'da Hızlı İzleme'yi kullanarak, aşağıdaki gibi atılan istisnanın ViewDetails öğesinden LoaderExceptions'a erişebilirsiniz:

($exception).LoaderExceptions

Teşekkürler! LoaderExceptionsGerçekten alakalı bilgiler içerdiğinden, erişmeye gerek kalmadan bu bilgileri neden eklemediğimi merak etmeme neden oluyor.
GuiRitter

0

Etrafta araştırma yapanlar ve / veya etkileşimli modda olanlar için başka bir Alternatif:

$ Hata [0] .Exception.LoaderExceptions

Not: [0] yığından en son Hatayı alır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.