Pengembangan Winform/wpf pasti mengacu pada banyak DLL pihak ketiga, tetapi setiap kali Anda mengemasnya, Anda perlu menyalin file di direktori Debug ke pelanggan atau membagikannya, yang tidak terlalu nyaman digunakan. Saya telah mencoba beberapa perangkat lunak untuk menggabungkan file dll sebelumnya, seperti ILMerge, Enigma Virtual Box, dll., tetapi sampai saya mengetahui tentang "Costura.Fody", saya merasa bahwa dunia jauh lebih baik~
Berikut ini adalah program yang ditulis oleh Winform, merujuk pada dua DLL "HttpHelper.dll" dan "Newtonsoft.Json.dll", ketika kami membuat program, akan ada file exe dan dua file DLL ini, yang membuat orang merasa sangat tidak nyaman, dan jika ada satu DLL yang lebih sedikit, program dapat melaporkan pengecualian, seperti yang ditunjukkan pada gambar di bawah ini:
Tautan di bawah ini adalah penggunaan sebelumnya (tidak disarankan)
Dengan menggunakan alat Costura.Fody, Anda dapat menggabungkan DLL sumber ke dalam EXE target
Beranda Proyek: https://github.com/Fody/Costura
Cara menggunakan, langsung instal paket nuget:
Setelah Anda berhasil menambahkan Costura.Fody, solusinya akan secara otomatis menambahkan file FodyWeavers.xml.
Buat ulang solusi, Anda dapat melihat keberhasilan Anda di direktori pembuatan program, semua DLL digabungkan dengan sempurna ke dalam exe, Anda dapat langsung menyalin file exe ke klien untuk dijalankan secara independen. Seperti yang ditunjukkan di bawah ini:
1>------ Semua pembangunan ulang telah dimulai: Proyek: itsvse, Konfigurasi: Debug ------ CPU apa pun 1> Fody: Fody (versi 2.0.0.0) Eksekusi 1> Fody/Costura: Tidak ada referensi untuk 'Costura.dll' yang ditemukan. Referensi tidak diubah. 1> Fody/Costura: Menyematkan 'E:\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Menyematkan 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' 1> Fody: Selesai Fody 609ms. 1> Fody: Melewati Verifikasi perakitan karena dinonaktifkan dalam konfigurasi 1> Fody: Selesai verifikasi dalam 3ms. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Meregenerasi semua: 1 berhasil, 0 gagal, dan 0 ========== dilewati
Seperti yang dapat dilihat dari gambar di atas, file yang dihasilkan tidak mengandung Newtonsoft.Json.dll, HttpHelper.dll dan Costura.dll tidak dihasilkan, hanya dua file, itsvse.exe dapat dijalankan langsung tanpa kesalahan! (File PDB dapat dihapus).
Mari kita gunakan alat ILSpy untuk mendekompilasi program kita dan melihat kode sumber yang dihasilkan, seperti yang ditunjukkan pada gambar di bawah ini:
Pengantar prinsip implementasi
Saat CLR mencoba memuat rakitan tetapi gagal memuat, CLR memunculkan peristiwa AppDomain.AssemblyResolve. Program kami dapat mendengarkan peristiwa ini dan mengembalikan rakitan yang CLR coba muat di penanganan peristiwa sehingga program dapat terus berfungsi secara normal.
Fody.Costura menyematkan semua DLL yang direferensikan oleh EXE ke dalam file EXE saat membangun proyek. Ketika program menggunakan salah satu DLL ini selama eksekusi (peristiwa AppDomain.AssemblyResolve dipicu karena CLR tidak dapat menemukan file DLL), DLL yang diperlukan diekstrak dari sumber daya yang disematkan dari file EXE.
Anda dapat melihat bahwa metode Lampirkan mendengarkan peristiwa AppDomain.AssemblyResolve. Ketika CLR gagal memuat rakitan dengan sukses, penanganan peristiwa AssemblyResolve dieksekusi. AssemblyResolve mencoba mendapatkan rakitan target dari sumber daya tertanam rakitan yang dimuat melalui metode Common.ReadFromEmbeddedResources dan mengembalikannya ke CLR.
Melihat ini, Anda mungkin bertanya, kapan metode Attach diterapkan?
Faktanya, untuk bahasa C#, CLR menyembunyikan trik besar - CLR dapat mengeksekusi beberapa kode yang diinisialisasi sebelum setiap modul (setiap rakitan berisi satu atau lebih modul) dimuat. Sayangnya, bahasa C# tidak memiliki kendali atas bagian kode ini. Fody.Costura menyuntikkan kode IL langsung ke dalam fungsi inisialisasi modul internal rakitan EXE, dan bagian kode IL ini benar-benar menjalankan metode Attach. Dengan cara ini, setelah rakitan EXE dimuat, metode Attach dapat segera dipanggil.
Di atas adalah pengantar singkat tentang prinsip implementasi Fody.Costura.
Konfigurasi lanjutan
Konfigurasi ini ditambahkan atau dimodifikasi dalam file CosturaFodyWeavers.xml.
CreateTemporaryAssemblies Default: false Ini menyematkan file yang disematkan ke dalam disk sebelum memuatnya ke dalam memori. Ini berguna untuk skenario tertentu di mana Anda ingin memuat rakitan dari file fisik.
IncludeDebugSymbols Default: true Mengontrol apakah .pdbs rakitan referensi juga disematkan.
Nonaktifkan Kompresi Default: false Rakitan tertanam dikompresi secara default dan tidak terkompresi saat dimuat. Anda dapat mematikan kompresi menggunakan opsi ini. Catatan: Pastikan untuk menonaktifkan properti ini saat mereferensikan DLL non-standar, atau DLL terenkripsi. Jika tidak, itu akan mengarah pada situasi bahwa mantan tidak dapat dibuka. Ini ditemukan ketika saya menggunakan DSkin.dll.
NonaktifkanPembersihan Default: false Sebagai bagian dari Costura, komponen tertanam tidak lagi disertakan dalam build. Pembersihan ini dapat dimatikan.
LoadAtModuleInit Default: true Costura dimuat secara default sebagai bagian dari inisialisasi modul. Bendera menonaktifkan perilaku. Pastikan Anda dapat menggunakan CosturaUtility.Initialize() di suatu tempat.
Kecualikan Rakitan Cara menggunakan: ExcludeAssemblies="DLL1| DLL2" Daftar nama rakitan untuk dikecualikan dari tindakan default "sematkan semua referensi lokal salinan".
SertakanRakitan Cara menggunakan: IncludeAssemblies="DLL1| DLL2" Daftar nama rakitan yang disertakan dalam tindakan default Menyematkan Semua Salin Referensi Lokal.
Tidak Dikelola32Majelis&Tidak Dikelola64Majelis Cara menggunakannya: Unmanaged32Assemblies="DLL1| DLL2" Tidak Dikelola64Assemblies="DLL1| DLL2" Rakitan mode campuran tidak dapat dimuat dengan cara yang sama seperti rakitan terkelola. Oleh karena itu, untuk membantu Costura mengidentifikasi komponen mana yang berada dalam mode campuran, dan di lingkungan mana untuk memuatnya, namanya harus disertakan dalam salah satu atau kedua daftar. Jangan menyertakan .exe atau .dll dalam nama.
Preload Order Penggunaan: PreloadOrder="DLL1| DLL2" Perpustakaan lokal dapat dimuat secara otomatis oleh Costura. Untuk menyertakan pustaka lokal, sertakan dalam proyek Anda sebagai sumber daya tertanam yang disebut folder costura32 atau costura64 tergantung pada ketidakstabilan pustaka. Atau, Anda dapat menentukan urutan pemuatan di mana pustaka yang dimuat sebelumnya dimuat. Saat Anda mencampur komponen sementara dari disk, komponen tersebut juga dimuat sebelumnya.
Utilitas CosturaUtility Cara menggunakan:
CosturaUtility adalah kelas yang memungkinkan Anda untuk menginisialisasi sistem Costura secara manual dalam kode Anda sendiri.Ini terutama untuk skenario di mana program inisialisasi modul tidak berfungsi, seperti perpustakaan dan Mono.
Terakhir, unduh kode sumber dalam teks:
Wisatawan, jika Anda ingin melihat konten tersembunyi dari posting ini, silakan Jawab
|