Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 219600|Jawab: 43

[Formulir Menang] .net/c# Gunakan Costura.Fody untuk mengemas DLL ke dalam EXE

[Salin tautan]
Diposting pada 14/04/2018 14.41.49 | | | |
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)

C# mengemas dll ke dalam program exe
http://www.itsvse.com/thread-2841-1-1.html
(Sumber: Architect_Programmer)



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, silakanJawab





Mantan:Solusi StreamReader untuk karakter kacau saat membaca file
Depan:Solusi untuk konflik antara Hyper-V dan VirtualBox dan VMware
Diposting pada 07/06/2018 09.35.19 |
Coba metode ini tentang mengintegrasikan komponen dependensi Dll ke dalam EXE yang dikompilasi C#!

Jika mudah digunakan, ingatlah untuk memujinya! Haha, ini, cukup tambahkan Dll ke file sumber daya, sederhana dan praktis! (Saya tidak mengerti, saya bisa membuat tutorial) @小渣渣

 Tuan tanah| Diposting pada 06/06/2018 10.30.42 |
Jika Anda menandatangani program, Anda akan menerima kesalahan berikut:

1>MSBUILD : kesalahan : Fody: Terjadi pengecualian yang tidak ditangani:
1>MSBUILD : kesalahan : Pengecualian:
1>MSBUILD: kesalahan: Tidak dapat mendapatkan kunci publik untuk StrongNameKeyPair.
1>MSBUILD : kesalahan : StackTrace:
1>MSBUILD: error: di System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: kesalahan: dalam System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: error: di Mono.Cecil.ModuleWriter.WriteModuleTo(modul ModuleDefinition, aliran Disposable'1, parameter WriterParameters)
1>MSBUILD: error: di Mono.Cecil.ModuleDefinition.Write(String fileName, parameter WriterParameters)
1>MSBUILD: error: Di posisi InnerWeaver.WriteModule() C:\projects\fody\FodyIsolated\ModuleWriter.cs: nomor baris 18
1>MSBUILD: kesalahan: Di posisi InnerWeaver.Execute() C:\projects\fody\FodyIsolated\InnerWeaver.cs: nomor baris 86
1>MSBUILD : kesalahan : Sumber:
1>MSBUILD : kesalahan : mscorlib
1>MSBUILD : kesalahan : TargetSite:
1>MSBUILD : kesalahan : Byte[] ComputePublicKey()
1>MSBUILD : kesalahan :
1> Fody: Selesai Fody 551ms.


Sepertinya tidak ada solusi, lihat artikel:

https://github.com/Fody/ExtraConstraints/issues/5

https://github.com/Fody/Costura/issues/194


Jangan mengandalkan nama yang kuat untuk tetap aman.

Jadi tampaknya tidak ada gunanya bekerja ekstra untuk melindungi sesuatu yang bukan fitur keamanan

 Tuan tanah| Diposting pada 17/04/2018 13.02.12 |
xxhh Dipaparkan pada 2018-4-17 11:35
Setelah menginstal Costura.Fody langsung di vs NuGet, saya menyeret pemutar Windows Media Playe untuk menghasilkan dua dll-in bawaan untuk dihapus atau dilaporkan ...

Kontrol Windows Media Player adalah komponen com, saya tidak tahu apakah "Costura.Fody" mendukungnya.

1: Anda akan melihat apakah "Costura.Fody" mendukung "komponen com"
2: Abaikan dua DLL yang dikemas, adapun cara mengabaikan xml harus diatur, silakan lihat dokumentasi resmi untuk detailnya
Diposting pada 17/04/2018 10.29.52 |
Unduh untuk melihat konfigurasi XML
Diposting pada 17/04/2018 10.33.34 |
Pemilik ingin bertanya apakah saya bisa mendapatkan video dan dll bersama-sama menjadi plugin exe
 Tuan tanah| Diposting pada 17/04/2018 11.16.15 |
xxhh Dipaparkan pada 2018-4-17 10:33
Pemilik ingin bertanya apakah saya bisa mendapatkan video dan dll bersama-sama menjadi plugin exe
...

Anda dapat melakukan ini, Anda dapat mengatur properti video ke "Sumber Daya Tertanam", lalu membaca file sumber daya.
Diposting pada 17/04/2018 11.35.51 |
Xiao Zhao Posted on 2018-4-17 11:16
Anda dapat melakukan ini, Anda dapat mengatur properti video ke "Sumber Daya Tertanam", lalu membaca file sumber daya. ...

Saya menyeret pemutar Windows Media Playe langsung setelah menginstal Costura.Fody di vs NuGet dan menghasilkan dua dlll bawaan untuk menghapus atau melaporkan kesalahan  
Diposting pada 17/04/2018 11.57.09 |
Apakah XML masih perlu diatur?     
Diposting pada 17/04/2018 17.42.31 |
Xiao Zhao Posted on 2018-4-17 11:16
Anda dapat melakukan ini, Anda dapat mengatur properti video ke "Sumber Daya Tertanam", lalu membaca file sumber daya. ...

Tuan tanah atau saya, saya ingin bertanya, saya memasukkan video ke dalam sumber daya yang disematkan, yang dibaca adalah array byte, apakah ada cara untuk memasukkannya ke pemutar dan memutarnya secara langsung (saya tidak ingin menulis ke lokal untuk diputar di jalur baca, videonya lebih dari kartu besar)
 Tuan tanah| Diposting pada 17/04/2018 20.52.16 |
xxhh Dipaparkan pada 2018-4-17 17:42
Tuan tanah atau saya, saya ingin bertanya, saya memasukkan video ke dalam sumber daya yang disematkan, dan yang terbaca adalah array byte, apakah ada cara untuk memasukkannya ke dalam pemutar dan memutarnya secara langsung ( ...

Tidak disarankan untuk membuat video besar menjadi file sumber daya, Anda dapat melihat apakah ada cara lain bagi pemutar untuk langsung meneruskan byte[]
Diposting pada 18/04/2018 08.08.48 |
Xiao Zhazha Dipaparkan pada 2018-4-17 20:52
Tidak disarankan untuk membuat video besar menjadi file sumber daya, Anda dapat melihat apakah ada cara lain bagi pemutar untuk langsung meneruskan byte[] ...

Tak satu pun dari mereka membaca alamat video dan ingin bertanya kepada Anda ide bagus apa yang Anda miliki
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com