Wie füge ich mehrere Baugruppen zu einer zusammen?


86

Ich verwende meinen Service-Stack mithilfe des EXE-Projekts (Startaufgabe für eine Azure-Anwendung), indem ich die folgende DLL des Service-Stacks und einige DLLs von Azure in das EXE-Projekt kopiert habe.

DLLs

Wenn ich dieses EXE-Projekt erstelle, werden Azure-DLLs mit meiner EXE-Datei gebündelt, aber die DLL des Dienststapels wird nicht mit EXE gebündelt, da ich die DLL aller Dienststapel manuell kopieren muss, um meine EXE-Datei auf einem beliebigen Computer auszuführen.

Ich habe die DLL dieses Service-Stacks verwendet

JsonServiceClient client = new JsonServiceClient(servicepath);

Was muss ich tun, um alle diese DLLs in meiner EXE-Datei zu bündeln?

Antworten:


120

Sie haben mehrere Möglichkeiten:

ODER

  • Verwenden Sie ein Tool wie SmartAssembly (kommerziell)
    , das unter anderem eingebettet und zusammengeführt werden kann (Sie müssen Ihren Quellcode nicht ändern).

ODER

  • Code, der selbst in weniger als 10 Zeilen (kostenlose, aber minimale Änderung des Quellcodes)
    alle erforderlichen Abhängigkeiten als "eingebettete Ressource" markiert - auf diese Weise sind sie in der EXE-Datei enthalten ... Sie müssen einen AssemblyResolveHandler einrichten, der zur Laufzeit aus Ressourcen liest und gibt die benötigten DLLs an die .NET-Laufzeit zurück ...

4
Vielen Dank, dass Sie mich an Jeffrey Richters Lösung zum Einbetten von Baugruppen erinnert haben! In meiner Antwort, in der Costura erwähnt wird, finden Sie ein Tool, das dies mit dem Einfügen des erforderlichen Codes kombiniert.
CodeFox

29

Das gesuchte Tool heißt ILMerge . Es ist ein Befehlszeilenprogramm und kann wie folgt verwendet werden:

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

Es gibt auch einen Artikel, der beschreibt , wie ILMerge in Ihren VS - Projekt - Setup ist hier


Hallo, kann ich der ausführbaren Datei eine externe Ressource (Datei / Bild) hinzufügen?
Emdadul Sawon

@EmdadulSawon Vielleicht können Sie sie als Ressourcen in eine Ihrer Bibliotheken aufnehmen?
Alexander

26

Ein großartiges Tool, um referenzierte Assemblys als eingebettete Ressourcen einzuschließen, ist Costura (ein Fody- Add-In). Der Autor Simon Kropp beschreibt es wie folgt:

[...] eine Kombination von zwei Methoden:

Das Ergebnis ist eine supereinfache Lösung, bei der lediglich Costura.Fody von NuGet abgerufen werden muss .

Eigenschaften:

  • Einschließlich Debug-Symbole
  • Komprimierung eingebetteter Baugruppen
  • Einschließen / Ausschließen bestimmter Baugruppen
  • Andere (siehe Readme )

9
OMG Costura.Fody ist die richtige Antwort. Installierte das Paket von Nuget, baute das Projekt neu und jetzt habe ich eine eigenständige EXE AWESOME!
Eric Labashosky

4
Ich kann nicht glauben, wie einfach es ist. Installieren Sie einfach Pakete von Nuget und Sie sind fertig.
iraSenthil

2
Ich benutze auch Costura.Fody. Es ist trivial einzurichten und ganz einfach, NuGet-Pakete als Ressourcen einzuschließen. Projekt abrufen.
Michael Silver

1
@ user3700562, diese Technik erstellt keine neuen Assemblys, sondern bettet eine oder mehrere referenzierte Assemblys in eine vorhandene ein.
CodeFox

1
Tolle Lösung! Ich benutze es seit einem Jahr und hatte kein Problem. Beachten Sie jedoch, dass nur Baugruppen enthalten sind, auf die Ihr Top-Projekt verweist. Wenn Ihre App auf ein anderes Projekt verweist, das auf eine Assembly eines Drittanbieters verweist, müssen Sie es Ihrem Projekt der obersten Ebene hinzufügen.
Demir


3

Wenn Sie WPF-Abhängigkeiten haben, sind Ihre Optionen möglicherweise eingeschränkter ..... ILMerge scheint sich nicht mit diesen zu befassen. Costura.Fody (wie oben von Codefox erwähnt) funktionierte jedoch perfekt für uns und brauchte ungefähr 5 Minuten, um loszulegen ... eine sehr gute Erfahrung.

Installation mit Nuget (Auswahl des richtigen Standardprojekts in der Package Manager-Konsole).

Es führt alle mit "Copy Local" = true gekennzeichneten DLLs zusammen und erzeugt eine zusammengeführte EXE-Datei (neben der Standardausgabe, von der die meisten jetzt nicht mehr erforderlich sind), die ebenfalls komprimiert wird. Dies kann dann eigenständig verwendet werden.

Die Lizenz ist MIT, da Sie sie nach Bedarf ändern / verteilen können.

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


2

Kasse der ServiceStack.Gap Projekt , das zeigt mehrere Beispiele von howto ILMerge ServiceStack in eine einzige plattformübergreifende Exe .

ServiceStack enthält auch eine Reihe anderer Funktionen, die sich besonders gut für die Erstellung eingebetteter Apps eignen:

  • Ermöglicht das Selbsthosting Ihrer Dienste mithilfe des HTTP-Listeners von .NET
  • Unterstützt vorkompilierte Razor Views
  • Unterstützt eingebettete Ressourcen
  • Unterstützt eine eingebettete Datenbank in Sqlite und OrmLite
  • Kann in eine einzelne EXE-Datei integriert werden

1

.net Core 3 führt zwei neue Optionen in die Projektkonfiguration ein, das Veröffentlichen und Trimmen einzelner Dateien.

Weitere Details zu den Dokumenten finden Sie hier . Die Projektkonfiguration wird hier als Referenz kopiert.

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

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

Es wird vollständig unterstützt, die beiden Optionen miteinander zu kombinieren, um eine zugeschnittene Einzelbaugruppe für Ihre Anwendung zu erhalten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.