Saya mencoba memindai rakitan untuk jenis yang menerapkan antarmuka tertentu menggunakan kode yang mirip dengan ini:
public List<Type> FindTypesImplementing<T>(string assemblyPath)
{
var matchingTypes = new List<Type>();
var asm = Assembly.LoadFrom(assemblyPath);
foreach (var t in asm.GetTypes())
{
if (typeof(T).IsAssignableFrom(t))
matchingTypes.Add(t);
}
return matchingTypes;
}
Masalah saya adalah, bahwa saya mendapatkan ReflectionTypeLoadException
ketika memanggil asm.GetTypes()
dalam beberapa kasus, misalnya jika assembly berisi jenis referensi assembly yang saat ini tidak tersedia.
Dalam kasus saya, saya tidak tertarik dengan jenis yang menyebabkan masalah. Tipe yang saya cari tidak memerlukan rakitan yang tidak tersedia.
Pertanyaannya adalah: apakah mungkin untuk melewati / mengabaikan tipe yang menyebabkan pengecualian tetapi masih memproses tipe lain yang terdapat dalam assembly?
AppDomain.CurrentDomain.GetAssemblies()
, ini berfungsi pada mesin saya tetapi tidak pada mesin lain. Mengapa sih beberapa rakitan dari executable saya tidak dapat dibaca / dimuat pula ??Jawaban:
Salah satu cara yang cukup buruk adalah:
Ini pasti menjengkelkan harus melakukan ini. Anda dapat menggunakan metode ekstensi untuk membuatnya lebih baik di kode "klien":
Anda mungkin ingin memindahkan
return
pernyataan keluar dari blok tangkap - saya tidak terlalu tertarik untuk berada di sana sendiri, tetapi mungkin itu adalah kode terpendek ...sumber
From t As Type In e.Types Where (t IsNot Nothing) AndAlso (t.TypeInitializer IsNot Nothing)
Tampaknya berfungsi dengan baik.Meskipun tampaknya tidak ada yang dapat dilakukan tanpa menerima ReflectionTypeLoadException di beberapa titik, jawaban di atas terbatas karena setiap upaya untuk memanfaatkan jenis yang disediakan dari pengecualian akan tetap memberikan masalah dengan masalah asli yang menyebabkan jenis tersebut gagal dimuat.
Untuk mengatasi ini, kode berikut membatasi jenis yang terletak di dalam rakitan dan memungkinkan predikat untuk lebih membatasi daftar jenis.
sumber
Sudahkah Anda mempertimbangkan Assembly.ReflectionOnlyLoad ? Mempertimbangkan apa yang Anda coba lakukan, itu mungkin cukup.
sumber
Dalam kasus saya, masalah yang sama disebabkan oleh adanya rakitan yang tidak diinginkan di folder aplikasi. Cobalah untuk menghapus folder Bin dan membangun kembali aplikasi.
sumber