webentwicklung-frage-antwort-db.com.de

Wie lässt sich Visual Studio auflösen und alle Abhängigkeiten meines Projekts während der Erstellung berücksichtigen?

Ich habe derzeit eine große Lösung unter VS2010, mit vielen Projekten und Abhängigkeiten. Einige davon sind im GAC installiert, andere nur aus einem "lib" -Ordner. Ich muss eines meiner Projekte (speziell eine WinForms-App) erstellen, um auf jedem Nicht-Entwicklungscomputer ohne Installationsprozess ausgeführt zu werden (mit Ausnahme der .NET-Laufzeitumgebung), genau wie bei tragbaren Apps.

Damit dies funktioniert, muss ich alle referenzierten DLLs und ihren gesamten Abhängigkeitsbaum im Ausgabeordner meiner EXE-Datei haben. Ich kann es zum Beispiel tun, indem ich die Abhängigkeiten im Eigenschaftenfenster als "Lokal kopieren" markiere. Dies funktioniert jedoch nur für die direkten Verweise auf das EXE-Projekt, daher reicht es nicht aus. Eine andere Möglichkeit ist, ein Setup-Projekt zu erstellen, aber mein Client und ich möchten das auch vermeiden (in der endgültigen Version werde ich ClickOnce verwenden). Natürlich kann ich es immer nur von Hand machen, alle DLLs manuell zusammenstellen, aber das ist schon ein Albtraum.

Gibt es ein Werkzeug, einen Msbuild-Trick, eine Befehlszeilenoption, einen beliebigen Hack, der Visual Studio zwingt, den gesamten Abhängigkeitsbaum meiner EXE während des Builds zu erfassen und in den Ausgabeordner zu kopieren? So konnte ich einfach alles zusammen zip und an meinen Client senden.

21
Zoltán Tamási

Ich habe tatsächlich eine etwas "mittlere" Lösung gewählt, wie folgt.

  1. Ich habe ein "Dummy" -Installationsprojekt erstellt, wobei es mir nicht darum ging, irgendetwas einzustellen, sondern die Projektausgaben hinzuzufügen (primäre Ausgabe, lokalisierte Ressourcen, Inhalte usw.). Es war eine 2-Minuten-Aufgabe auf diese Weise.
  2. Ich baute das Setup-Projekt auf und erhielt die MSI-Datei als Ausgabe.
  3. Ich habe den Inhalt der MSI-Datei in einen bestimmten Ordner extrahiert, der beispielsweise "MyAppPortable" genannt wird. Ich habe die Lösung hier gefunden. Der Befehlszeilenbefehl lautet

    msiexec/a "absolute_path_to_my_MSI_output"/qb TARGETDIR = "absolute_path_to_my_desired_output_folder"

  4. Ich habe die vollständige Anwendung mit allen aufgelösten Abhängigkeiten erhalten (außer für spät bindende Abhängigkeiten, aber ich habe mich manuell darum gekümmert, indem ich sie als Referenzen zu meinen Projekten hinzufügte). Ich konnte den ganzen Ordner mit einem Zip versehen, ihn auf einen anderen Computer legen und voila, alles hat gut funktioniert.

1
Zoltán Tamási

Grundsätzlich können Sie in Visual Studio festlegen, dass alle Projekte Ihrer Projektmappe im selben Ausgabeordner erstellt werden und diesen Ordner als Windows Form-Anwendungsordner verwenden (in dem sich die Anwendungs-EXE befindet).

Auf diese Weise koordinieren Sie alle möglichen Assemblyverweise, von denen Ihre App abhängig ist.

Klicken Sie in VS 2012 mit der rechten Maustaste auf ein Projekt => Eigenschaften => Erstellen auswählen (linker Bereich) => Legen Sie Ihren Ausgabepfad fest:

Output path in VS 2012

Ich würde einen Ordner auf Lösungsebene als Ausgabepfad auswählen .

Und wenn es verboten ist, eine solche Änderung an Ihrem Arbeitsplatz durchzuführen, empfehle ich Ihnen, Tools zur Abhängigkeitsanalyse wie die folgenden zu verwenden, um die entsprechenden Assemblys abzufragen und zu erfassen, von denen Ihre App abhängig ist und die zur Laufzeit benötigt werden:

Update:

Wenn Sie die oben genannten Tools verwenden, erhalten Sie keine Assemblyverweise, die (zur Laufzeit) zu spät gebunden sind. In diesem Fall können Sie Folgendes verwenden: Fusion (der Assembly Binding Log Viewer)

1
Yair Nevet

Schauen Sie sich die Fody/Costura-Empfehlung aus dieser Frage an: Einbetten von DLLs in eine kompilierte ausführbare Datei

Es ist toll! Ich habe es gerade für ein ähnliches Bedürfnis ausprobiert und in weniger als ein paar Minuten hatte ich eine komplett portable (außer dem .Net-Framework), die ich leicht an Kollegen weitergeben konnte.

0
Matt Penner