DLL saya dimuat oleh aplikasi pihak ketiga, yang tidak dapat kami sesuaikan. Majelis saya harus ditempatkan di folder mereka sendiri. Saya tidak bisa memasukkannya ke GAC (aplikasi saya memiliki persyaratan untuk digunakan menggunakan XCOPY). Ketika root DLL mencoba memuat sumber atau ketik dari DLL lain (dalam folder yang sama), pemuatan gagal (FileNotFound). Apakah mungkin untuk menambahkan folder tempat DLL saya berada ke jalur pencarian perakitan secara terprogram (dari DLL root)? Saya tidak diizinkan mengubah file konfigurasi aplikasi.
.net
search
assemblies
path
isobretatel
sumber
sumber
if (!File.Exists(asmPath)) return searchInGAC(...);
Anda bisa menambahkan jalur probing ke file .config aplikasi Anda, tetapi itu hanya akan berfungsi jika path probing terdapat di dalam direktori basis aplikasi Anda.
sumber
AssemblyResolve
solusinya berkali-kali, bagus untuk memiliki pilihan lain (dan lebih mudah).Pembaruan untuk Kerangka 4
Karena Kerangka 4 meningkatkan acara AssemblyResolve juga untuk sumber daya sebenarnya penangan ini bekerja lebih baik. Ini didasarkan pada konsep bahwa pelokalan berada dalam subdirektori aplikasi (satu untuk pelokalan dengan nama budaya yaitu C: \ MyApp \ it untuk Italia) Di dalam ada file sumber daya. Pawang bekerja juga jika pelokalannya adalah negara-wilayah yaitu IT-IT atau pt-BR. Dalam hal ini pawang "mungkin dipanggil beberapa kali: satu kali untuk setiap budaya dalam rantai fallback" [dari MSDN]. Ini berarti bahwa jika kita mengembalikan null untuk file sumber daya "it-IT" kerangka kerja memunculkan acara yang meminta "it".
Acara kait
Penangan acara
sumber
AssemblyName
konstruktor untuk memecahkan kode nama rakitan alih-alih mengandalkan penguraian string rakitan.Penjelasan terbaik dari MS itu sendiri :
sumber
AssemblyResolve
untuk CurrentDomain, tidak berlaku untuk domain lainAppDomain.CreateDomain
Untuk pengguna C ++ / CLI, inilah jawaban @Mattias S '(yang cocok untuk saya):
sumber
Saya telah menggunakan solusi @Mattias S. Jika Anda benar-benar ingin menyelesaikan ketergantungan dari folder yang sama - Anda harus mencoba menggunakan Meminta lokasi perakitan , seperti yang ditunjukkan di bawah ini. args.RequestingAssembly harus diperiksa untuk membatalkan.
sumber
lihat AppDomain.AppendPrivatePath (usang) atau AppDomainSetup.PrivateBinPath
sumber
AppDomain.AppendPrivatePath
Dokumentasi tampaknya menyarankan bahwa ia harus mendukung perluasanAppDomain
jalur pencarian secara dinamis , hanya saja fitur tersebut sudah tidak digunakan lagi. Jika berhasil, ini adalah solusi yang jauh lebih bersih daripada kelebihan bebanAssemblyResolve
.AppDomain.AppendPrivatePath
tidak melakukan apa-apa di .NET Core dan pembaruan.PrivateBinPath
dalam kerangka penuh .Saya datang ke sini dari pertanyaan lain (duplikat bertanda) tentang menambahkan tag probing ke file App.Config.
Saya ingin menambahkan sidenote ke ini - Visual studio telah menghasilkan file App.config, namun menambahkan tag probing ke tag runtime yang dibuat sebelumnya tidak berfungsi! Anda memerlukan tag runtime terpisah dengan tag probing disertakan. Singkatnya, App.Config Anda akan terlihat seperti ini:
Butuh beberapa waktu untuk mencari tahu jadi saya mempostingnya di sini. Juga menerima Paket The PrettyBin NuGet . Ini adalah paket yang memindahkan dll secara otomatis. Saya menyukai pendekatan yang lebih manual sehingga saya tidak menggunakannya.
Juga - di sini adalah skrip pembuatan pos yang menyalin semua .dll / .xml / .pdb ke / Lib. Ini membuka folder / debug (atau / release), apa yang saya pikir orang capai.
sumber