Domanda:
Software per raggruppare assembly .NET in un singolo assembly
allquixotic
2014-02-05 04:16:42 UTC
view on stackexchange narkive permalink

Supponiamo che io abbia un programma .NET / CLR Hello.exe (o una DLL Hello.dll ) che dipende da varie DLL .NET di terze parti. Voglio spedire un singolo file, senza fornire un vero "programma di installazione", quindi sto cercando un software in grado di comprimere tutte le dipendenze nell'eseguibile, quindi caricarle prima che il mio codice inizi a funzionare.

Ne ho anche bisogno per caricare incondizionatamente ogni DLL fornita, non solo "su richiesta", perché ad alcuni dei tipi nelle DLL si accede tramite reflection e quindi il caricatore di classi non tenterà mai di caricare esplicitamente la DLL e quindi chiama il class loader hook. Non voglio dover aggiungere codice al mio eseguibile se è possibile farlo senza il mio codice.

Sto usando SharpDevelop e .NET Framework 4.0 Full Profile, ma la soluzione ideale per questo problema sarà indipendente dall'IDE e funzionerà con .NET 3.0 o successivo (2.0 sarebbe anche meglio, ma non diventiamo avidi ...)

Potresti potenzialmente comprimere gli assembly in un singolo file e poi, al caricamento dell'applicazione, lanciarli in una directory temporanea per un possibile caricamento e quindi utilizzare ʻAssembly.LoadFrom` per fare il lavoro effettivo?
Queste DLL di terze parti sono gestite o native? Hai bisogno anche di impacchettare .NET framework, cioè eseguire la tua app senza installare .NET?
No, non è necessario eseguire l'app senza .NET Framework installato. Le DLL di terze parti sono per lo più assembly .NET puri, ma alcuni sono nativi.
Tre risposte:
#1
+8
BatteryBackupUnit
2014-06-19 11:19:05 UTC
view on stackexchange narkive permalink

Che ne dici di ILMerge? È in circolazione da molto tempo e ci sono molte risorse. Ad esempio, ecco una introduzione rapida. Inoltre le domande su stackoverflow hanno già coperto alcune insidie ​​comuni, come Unione di DLL con EXE.

È anche indipendente dall'ambiente di compilazione. Devi solo incorporarlo nel tuo processo di compilazione.

ILMerge purtroppo non è perfetto. Ad esempio, non supporta l'unione di assembly WPF. L'alternativa è incorporare le librerie come risorse e caricarle dinamicamente. Ad esempio, vedi questo post del blog. Il contenitore LibZ che allquixotic ha menzionato fondamentalmente lo fa.

Al contenitore LibZ, c'è un'altra alternativa, una che è stata provata e ci penserei seriamente: Fody.Costura

Mono mkbundle potrebbe essere un'altra alternativa, tieni presente tuttavia che produce codice nativo. Le dipendenze possono essere collegate staticamente. Su Windows, richiede anche cygwin per essere in grado di funzionare (vedi anche questo thread del forum)

#2
+5
allquixotic
2014-02-05 04:55:11 UTC
view on stackexchange narkive permalink

LibZ Container strumentalizza l'assembly principale con codice che decomprime le risorse dell'assembly zippate dal file di risorse e le carica dalla memoria. Afferma di funzionare con il codice di riflessione e con i nomi sicuri e non modifica in alcun modo i file di assembly originali, quindi i riferimenti con nome sicuro funzioneranno bene.

Potresti approfondire un po 'di più su questo strumento? Aggiungi qualche esperienza personale alla tua raccomandazione? È facile da configurare / utilizzare? Forse aggiungere un esempio?
#3
  0
allquixotic
2014-02-05 04:53:41 UTC
view on stackexchange narkive permalink

il-repack soddisfa parzialmente i criteri della risposta, ma sfortunatamente riconfeziona gli assembly, il che rompe il loro nome forte, quindi se dipendi da assembly firmati con un nome forte, questo ha vinto funziona. Inoltre, non funziona con la maggior parte del codice di riflessione fino a quando gli assembly non sono stati caricati in classe.

Potresti approfondire un po 'di più su questo strumento? Aggiungi un po 'di esperienza personale alla tua raccomandazione? È facile da configurare / utilizzare? Forse aggiungere un esempio?


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...