Bagaimana cara menggabungkan beberapa majelis menjadi satu?

87

Saya menggunakan tumpukan layanan saya menggunakan proyek EXE (tugas startup untuk aplikasi biru) karena saya telah menyalin DLL tumpukan layanan berikut & beberapa DLL Azure ke dalam proyek EXE.

dll

Ketika saya membangun proyek EXE ini maka Azure DLL akan dibundel dengan EXE saya tetapi DLL tumpukan layanan tidak akan digabungkan dengan EXE, karena untuk menjalankan EXE saya di mesin apa pun, saya perlu menyalin semua DLL tumpukan layanan secara manual.

Saya telah menggunakan dll layanan tumpukan ini untuk digunakan

JsonServiceClient client = new JsonServiceClient(servicepath);

Apa yang harus saya lakukan untuk menggabungkan semua DLL ini ke dalam EXE saya?

Arun Rana
sumber

Jawaban:

120

Anda memiliki beberapa opsi:

ATAU

  • menggunakan beberapa alat seperti SmartAssembly (komersial)
    itu dapat menyematkan dan menggabungkan antara lain (tidak perlu mengubah kode sumber Anda)

ATAU

  • kode yang Anda sendiri kurang dari 10 baris (gratis tetapi perubahan kode sumber minimal)
    menandai semua dependensi yang diperlukan sebagai "sumber daya tertanam" - dengan cara ini mereka disertakan dalam file EXE ... Anda perlu menyiapkan AssemblyResolvepenangan yang pada waktu proses membaca dari Sumber Daya dan mengembalikan DLL yang diperlukan ke runtime .NET ...
Yahia
sumber
4
Terima kasih telah mengingatkan saya tentang solusi Jeffrey Richter untuk memasang rakitan! Lihat jawaban saya menyebutkan Costura untuk alat yang menggabungkan ini dengan menyuntikkan kode yang diperlukan.
CodeFox
29

Alat yang Anda cari disebut ILMerge . Ini adalah alat baris perintah dan dapat digunakan seperti ini:

ilmerge /target:winexe /out:MyApp.exe 
        MyExe.exe ServiceStack.dll ServiceStack.Interfaces.dll ServiceStack.ServiceInterface.dll  ServiceStack.Text.dll

Ada juga artikel yang menjelaskan cara menyertakan ILMerge ke dalam penyiapan proyek VS Anda di sini

yas4891
sumber
Hai, dapatkah saya menambahkan sumber daya eksternal (file / gambar) ke dalam file yang dapat dieksekusi?
Emdadul Sawon
@EmdadulSawon mungkin Anda dapat memasukkannya sebagai sumber daya di salah satu libs Anda?
Alexander
27

Alat hebat untuk menyertakan rakitan yang direferensikan sebagai sumber daya yang disematkan adalah Costura ( add-in Fody ). Penulis Simon Kropp menggambarkannya sebagai berikut:

[...] kombinasi dari dua metode:

Hasilnya adalah solusi super sederhana yang hanya perlu mengambil Costura.Fody dari NuGet.

Fitur:

  • Termasuk simbol debug
  • Kompresi rakitan tertanam
  • Termasuk / tidak termasuk majelis tertentu
  • Lainnya (lihat Readme )
CodeFox
sumber
9
OMG Costura.Fody adalah jawaban yang tepat. Menginstal paket dari nuget, membangun kembali proyek dan sekarang saya memiliki EXE AWESOME !!
Eric Labashosky
4
Saya tidak percaya betapa mudahnya itu. Cukup instal paket dari nuget dan Anda selesai.
iraSenthil
2
Saya menggunakan Costura.Fody juga. Sangat mudah untuk mengatur dan sangat mudah untuk memasukkan paket NuGet sebagai sumber daya. Dapatkan proyek.
Michael Silver
1
@ user3700562, teknik ini tidak membuat rakitan baru tetapi menyematkan satu atau lebih rakitan yang direferensikan ke rakitan yang sudah ada.
CodeFox
1
Solusi bagus! Saya menggunakannya sejak satu tahun dan tidak ada masalah. Tapi harap dicatat itu hanya mencakup rakitan yang direferensikan oleh proyek teratas Anda. Jika aplikasi Anda mereferensikan proyek lain yang mereferensikan rakitan pihak ketiga, Anda perlu menambahkannya ke proyek tingkat atas Anda.
Demir
3

Jika Anda memiliki ketergantungan WPF, pilihan Anda mungkin lebih terbatas ..... ILMerge tampaknya tidak menangani ini. Costura.Fody (seperti yang disebutkan oleh Codefox di atas) bekerja dengan sempurna untuk kami namun dan membutuhkan waktu sekitar 5 menit untuk memulai ... pengalaman yang sangat bagus.

Instal dengan Nuget (memilih proyek default yang benar di Package Manager Console).

Ini menggabungkan semua DLL yang ditandai "Salin Lokal" = true dan menghasilkan gabungan .EXE (di samping keluaran standar, yang sebagian besar sekarang tidak diperlukan) yang juga dikompresi. Ini kemudian dapat digunakan secara mandiri.

Lisensi MIT sehingga Anda dapat memodifikasi / mendistribusikan sesuai kebutuhan.

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

rexall
sumber
2

Lihat proyek ServiceStack.Gap yang menunjukkan beberapa contoh cara ILMerge ServiceStack menjadi satu lintas platform .exe .

ServiceStack juga menyertakan sejumlah fitur lain yang sangat cocok untuk membuat aplikasi tersemat ini di mana:

  • Mengizinkan layanan Anda dihosting sendiri menggunakan Pemroses HTTP .NET
  • Mendukung Tampilan Razor yang telah dikompilasi sebelumnya
  • Mendukung Sumber Daya Tertanam
  • Mendukung database tertanam di Sqlite dan OrmLite
  • Dapat di-ILMerged menjadi satu .exe
Mythz
sumber
2

.net core 3 memperkenalkan dua opsi baru dalam konfigurasi project, yang disebut single file publish dan trimming.

Anda dapat menemukan detail lebih lanjut tentang dokumen di sini , konfigurasi proyek disalin di sini untuk referensi.

  1. Konfigurasi Proyek:
    <PropertyGroup>
      <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
      <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

    <PropertyGroup>
      <PublishTrimmed>true</PublishTrimmed>
    </PropertyGroup>
  1. Menggunakan CLI:
    dotnet publish -r win10-x64 -p:PublishSingleFile=true
    dotnet publish -r <rid> -c Release

Ini sepenuhnya didukung untuk menggabungkan dua opsi bersama-sama untuk mendapatkan perakitan tunggal yang dipangkas untuk aplikasi Anda.

Tanveer Badar
sumber
2
Ini tidak memberi Anda perakitan tunggal. Ini hanya memampatkan file Anda ke dalam arsip zip dan kemudian membukanya ke folder pengguna ketika Anda mencoba menjalankan aplikasi.
Jesper