Frage:
Software zum Bündeln von .NET-Assemblys in einer einzelnen Assembly
allquixotic
2014-02-05 04:16:42 UTC
view on stackexchange narkive permalink

Angenommen, ich habe ein .NET / CLR-Programm Hello.exe (oder eine DLL Hello.dll ), das von verschiedenen .NET-DLLs von Drittanbietern abhängt. Ich möchte eine einzelne Datei versenden, ohne ein tatsächliches "Installationsprogramm" bereitzustellen. Daher suche ich nach einer Software, die alle Abhängigkeiten in die ausführbare Datei packen und sie dann laden kann, bevor mein Code ausgeführt wird.

Ich brauche es auch, um jede gelieferte DLL bedingungslos zu laden, nicht nur "on-demand", da auf einige der Typen in den DLLs über Reflection zugegriffen wird und der Klassenlader niemals versucht, die DLL und explizit zu laden Rufen Sie daher den Class Loader Hook auf. Ich möchte meiner ausführbaren Datei keinen Code hinzufügen müssen, wenn dies ohne meinen eigenen Code möglich ist.

Ich verwende SharpDevelop und .NET Framework 4.0 Full Profile, aber die ideale Lösung dafür Dieses Problem ist IDE-unabhängig und funktioniert mit .NET 3.0 oder höher (2.0 wäre noch besser, aber lassen Sie uns nicht gierig werden ...)

Sie könnten die Assemblys möglicherweise in eine einzelne Datei packen und sie dann beim Laden der Anwendung zum möglichen Laden in ein temporäres Verzeichnis werfen und dann "Assembly.LoadFrom" verwenden, um die eigentliche Arbeit zu erledigen?
Werden diese DLLs von Drittanbietern verwaltet oder sind sie nativ? Müssen Sie auch .NET Framework packen, d. H. Ihre App ohne Installation von .NET ausführen?
Nein, ich muss die App nicht ausführen, ohne dass .NET Framework installiert ist. Die DLLs von Drittanbietern sind meistens reine .NET-Assemblys, einige sind jedoch nativ.
Drei antworten:
#1
+8
BatteryBackupUnit
2014-06-19 11:19:05 UTC
view on stackexchange narkive permalink

Wie wäre es mit ILMerge? Es gibt es schon lange und es gibt viele Ressourcen. Zum Beispiel hier ein schnelles Intro. Auch Fragen zum Stackoverflow haben bereits einige häufige Fallstricke behandelt, wie Zusammenführen von DLL mit EXE.

Es ist auch unabhängig von Ihrer Build-Umgebung. Sie müssen es nur in Ihren Erstellungsprozess einbetten.

ILMerge ist leider nicht perfekt. Beispielsweise wird das Zusammenführen von WPF-Assemblys nicht unterstützt. Alternativ können Sie die Bibliotheken als Ressourcen einbetten und dynamisch laden. Siehe zum Beispiel diesen Blog-Beitrag. Der von allquixotic erwähnte LibZ-Container macht das im Grunde.

Zum LibZ-Container gibt es eine andere Alternative, die ausprobiert wird, und ich würde ernsthaft darüber nachdenken: Fody.Costura

Mono mkbundle ist möglicherweise eine weitere Alternative. Beachten Sie jedoch, dass es nativen Code erzeugt. Abhängigkeiten können statisch verknüpft werden. Unter Windows muss Cygwin auch ausgeführt werden können (siehe auch diesen Forenthread)

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

LibZ Container instrumentiert Ihre Hauptbaugruppe mit Code, der komprimierte Baugruppenressourcen aus der Ressourcendatei entpackt und aus dem Speicher lädt. Es behauptet, mit Reflektionscode sowie starken Namen zu arbeiten, und es ändert die ursprünglichen Assembly-Dateien in keiner Weise, so dass Verweise mit starken Namen gut funktionieren.

Könnten Sie etwas mehr über dieses Tool erzählen? Fügen Sie Ihrer Empfehlung persönliche Erfahrungen hinzu? Ist es einfach zu konfigurieren / zu verwenden? Vielleicht ein Beispiel hinzufügen?
#3
  0
allquixotic
2014-02-05 04:53:41 UTC
view on stackexchange narkive permalink

il-repack erfüllt teilweise die Kriterien der Antwort, packt jedoch die Assemblys leider neu, wodurch ihr starker Name gebrochen wird. Wenn Sie also auf Assemblys angewiesen sind, die mit einem starken Namen signiert sind, hat dies gewonnen funktioniert nicht Es funktioniert auch mit den meisten Reflektionscodes erst, nachdem die Assemblys in die Klasse geladen wurden.

Könnten Sie etwas mehr über dieses Tool erzählen? Fügen Sie Ihrer Empfehlung persönliche Erfahrungen hinzu? Ist es einfach zu konfigurieren / zu verwenden? Vielleicht ein Beispiel hinzufügen?


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...