Come unire più assembly in uno?


87

Sto consumando il mio stack di servizi usando il progetto EXE (attività di avvio per l'applicazione azure) in quanto ho copiato la seguente DLL dello stack di servizi e alcune DLL di Azure nel progetto EXE.

dll

Quando creo questo progetto EXE, le DLL di Azure verranno raggruppate con il mio EXE ma la DLL dello stack di servizi non verrà raggruppata con EXE, perché per eseguire il mio EXE su qualsiasi macchina devo copiare manualmente tutte le DLL dello stack di servizi.

Ho usato la dll di questo stack di servizi da usare

JsonServiceClient client = new JsonServiceClient(servicepath);

Cosa devo fare per raggruppare tutte queste DLL nel mio EXE?

Risposte:


120

Hai diverse opzioni:

O

  • usa uno strumento come SmartAssembly (commerciale)
    può incorporare e unire tra le altre cose (non è necessario modificare il codice sorgente)

O

  • codice che tu stesso in meno di 10 righe (modifica gratuita ma minima del codice sorgente)
    contrassegna tutte le dipendenze necessarie come "risorsa incorporata" - in questo modo sono incluse nel file EXE ... devi impostare un AssemblyResolvegestore che in fase di esecuzione legge da Risorse e restituisce le DLL necessarie al runtime .NET ...

4
Grazie per avermi ricordato la soluzione di Jeffrey Richter per l'incorporamento degli assiemi! Vedi la mia risposta che menziona Costura per uno strumento che combina questo con l'iniezione del codice necessario.
CodeFox

29

Lo strumento che stai cercando si chiama ILMerge . È uno strumento da riga di comando e può essere utilizzato in questo modo:

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

C'è anche un articolo che descrive come includere ILMerge nella configurazione del progetto VS qui


Salve, posso aggiungere una risorsa esterna (file / immagine) nell'eseguibile?
Emdadul Sawon

@EmdadulSawon forse puoi includerli come risorse in una delle tue librerie?
Alexander

27

Un ottimo strumento per includere assembly di riferimento come risorse incorporate è Costura (un componente aggiuntivo Fody ). L'autore Simon Kropp lo descrive come segue:

[...] una combinazione di due metodi:

Il risultato è una soluzione semplicissima che richiede semplicemente di recuperare Costura.Fody da NuGet.

Caratteristiche:

  • Compresi i simboli di debug
  • Compressione di assembly incorporati
  • Includere / escludere assemblaggi specifici
  • Altri (vedi Readme )

9
OMG Costura.Fody è la risposta giusta. Ho installato il pacchetto da nuget, ho ricostruito il progetto e ora ho un EXE autonomo FANTASTICO !!
Eric Labashosky

4
Non riesco a credere quanto sia facile. Basta installare i pacchetti da nuget e il gioco è fatto.
iraSenthil

2
Sto usando anche Costura.Fody. È semplice da configurare ed è estremamente facile includere i pacchetti NuGet come risorse. Ottieni progetto.
Michael Silver

1
@ user3700562, questa tecnica non crea nuovi assembly ma piuttosto incorpora uno o più assembly referenziati in uno esistente.
CodeFox

1
Ottima soluzione! Lo uso da un anno e non ho avuto problemi. Ma tieni presente che include solo gli assembly a cui fa riferimento il tuo progetto principale. Se la tua app fa riferimento a un altro progetto che fa riferimento a un assembly di terze parti, devi aggiungerla al tuo progetto di primo livello.
Demir


3

Se hai dipendenze WPF le tue opzioni potrebbero essere più limitate ..... ILMerge non sembra occuparsene. Costura.Fody (come menzionato da Codefox sopra) ha funzionato perfettamente per noi e ci sono voluti circa 5 minuti per andare avanti ... un'esperienza molto positiva.

Installa con Nuget (selezionando il progetto predefinito corretto nella console di Gestione pacchetti).

Unisce tutte le DLL contrassegnate con "Copia locale" = true e produce un file .EXE unito (insieme all'output standard, la maggior parte del quale non è più necessario) anch'esso compresso. Questo può quindi essere utilizzato autonomamente.

La licenza è MIT in quanto è possibile modificare / distribuire secondo necessità.

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


2

Verifica la ServiceStack.Gap progetto che mostra alcuni esempi di howto ILMerge ServiceStack in un'unica piattaforme exe .

ServiceStack include anche una serie di altre funzionalità particolarmente adatte per la creazione di app incorporate in cui:

  • Consente ai tuoi servizi di essere ospitati autonomamente utilizzando il listener HTTP di .NET
  • Supporta visualizzazioni Razor precompilate
  • Supporta risorse incorporate
  • Supporta un database incorporato in Sqlite e OrmLite
  • Può essere unito in un unico file .exe

1

.net core 3 introduce due nuove opzioni nella configurazione del progetto, chiamate pubblicazione e taglio di un singolo file.

Puoi trovare maggiori dettagli sui documenti qui , la configurazione del progetto copiata qui per riferimento.

  1. Configurazione del progetto:
    <PropertyGroup>
      <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
      <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

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

È completamente supportato per combinare le due opzioni insieme per ottenere un singolo assieme tagliato per la tua applicazione.


Questo non ti dà una singola assemblea. Comprime semplicemente i file in un archivio zip e quindi lo decomprime in una cartella utente quando si tenta di eseguire l'applicazione.
Jesper
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.