Saya melihat dokumentasi msdn dan saya masih sedikit bingung tentang apa sebenarnya perbedaan antara menggunakan LoadFile
dan LoadFrom
saat memuat rakitan. Dapatkah seseorang memberikan contoh atau analogi untuk menggambarkannya dengan lebih baik. Dokumentasi MSDN membuat saya semakin bingung. Juga, Apakah ReflectionOnlyLoadFrom
sama dengan LoadFrom
kecuali bahwa itu memuat rakitan hanya dalam mode refleksi.
Karena pengalaman .NET saya bukanlah yang terbaik, berikut adalah beberapa pertanyaan tentang dokumentasi MSDN menggunakan LoadFile:
1) Apa yang dimaksud dengan LoadFile
majelis ujian yang memiliki Identitas yang sama, tetapi berada di jalur yang berbeda? Apa identitas (contoh)?
2) Ini menyatakan LoadFile
tidak memuat file ke dalam 'Konteks LoadFrom' dan tidak menyelesaikan ketergantungan menggunakan jalur beban. Artinya, dapatkah seseorang memberikan contoh?
3) Terakhir, ini menyatakan bahwa LoadFile
berguna dalam skenario terbatas ini karena LoadFrom tidak dapat memuat rakitan yang memiliki identitas yang sama tetapi jalur yang berbeda; itu hanya akan memuat majelis pertama, yang sekali lagi membawa saya ke pertanyaan yang sama, apa identitas majelis?
Jawaban:
Apakah ini menjelaskannya?
Sunting : untuk menjawab pertanyaan yang Anda ajukan dalam pertanyaan revisi Anda, Anda pasti ingin membaca Suzanne Cook tentang Identitas Majelis .
Ada banyak aturan yang mengatur bagaimana rakitan dimuat, dan beberapa di antaranya berkaitan dengan cara mereka menyelesaikan dependensi - jika AssemblyA Anda bergantung pada AssemblyB, di mana .NET harus mencari untuk menemukan AssemblyB? Di Cache Majelis Global, direktori yang sama yang ditemukannya AssemblyA, atau di tempat lain seluruhnya? Selain itu, jika menemukan banyak salinan dari rakitan itu, bagaimana cara memilih mana yang akan digunakan?
LoadFrom
memiliki satu set aturan, sementaraLoadFile
memiliki seperangkat aturan lain. Sulit membayangkan banyak alasan untuk menggunakanLoadFile
, tetapi jika Anda perlu menggunakan refleksi pada salinan yang berbeda dari rakitan yang sama, itu ada untuk Anda.sumber
string.Compare(x, y) == 0
? Saya pikir Anda ingin dix == y
sana? Jika karena alasan yang tidak jelas Anda benar-benar menginginkan pemeriksaan kesetaraan yang bergantung pada budaya, lebih jelas untuk menulisnyastring.Equals(x, y, StringComparison.CurrentCulture)
, misalnya.Dari blog Suzanne Cook :
Lihat disini .
Lihat juga artikel Memilih Konteks yang Mengikat di blog yang sama.
sumber
Setelah banyak garuk kepala, saya menemukan perbedaan pada diri saya sore ini.
Saya ingin memuat DLL saat runtime, dan DLL tinggal di direktori lain. DLL itu memiliki dependensinya sendiri (DLL) yang juga tinggal di direktori yang sama.
LoadFile (): Memuat DLL tertentu, tetapi tidak dependensinya. Jadi, ketika panggilan pertama dibuat dari dalam DLL ke salah satu DLL lainnya, itu melemparkan FileNotFoundException.
LoadFrom (): Memuat DLL yang saya tentukan dan juga semua dependensi yang ada di direktori itu.
sumber
FileNotFoundException
saat membuat instance baru dari objek yang ditentukan dalam assembly yang direferensikan oleh assembly yang baru saja saya muat.LoadFile
. Mengubah ini menjadi.LoadFrom
tampaknya memperbaiki masalah, tetapi saya tidak tahu mengapa! Terima kasihCatatan: Jika satu rakitan dimuat menggunakan jalur 8.3, dan kemudian dari jalur non-8.3, mereka akan terlihat sebagai rakitan yang berbeda, meskipun mereka adalah DLL fisik yang sama.
sumber
.NET memiliki konteks beban yang berbeda. Suzanne Cook menulis tentang mereka di sini: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx
Ini adalah cara karantina .NET agar referensi tidak tercampur.
sumber
satu perbedaan yang saya perhatikan adalah:
Assembly.LoadFile - Memuat assembly di AppDomain berbeda dengan hak pengguna terbatas (prinsip perbedaan). operasi seperti serilisasi / deserilisasi tidak dapat dilakukan.
Assembly.LoadFrom - Memuat assembly di AppDomain yang sama dengan hak pengguna yang sama (prinsip yang sama).
sumber
Dalam kasus saya, saya hanya perlu menghapus cache aplikasi ASP yang terletak @
C:\Windows\Microsoft.NET\Framework\[asp version]\Temporary ASP.NET Files
. Itu dibangun kembali saat situs pertama kali dijalankan. Pastikan untuk menghentikan IIS terlebih dahulu.Semoga ini membantu seseorang seperti itu untuk saya.
sumber