web-dev-qa-db-fra.com

Comment faire pour Visual Studio résoudre et inclure toutes les dépendances de mon projet lors de la construction?

J'ai une grande solution actuellement sous VS2010, avec beaucoup de projets et de dépendances. Certains d'entre eux sont installés sur le GAC, d'autres sont simplement inclus dans un dossier "lib". Je dois créer l'un de mes projets (en particulier une application WinForms) pour pouvoir fonctionner sur tous les ordinateurs ne nécessitant pas de développement, sans aucun processus d'installation (à l'exception du runtime .NET bien entendu), comme le font les applications portables.

Pour que cela fonctionne, j'ai besoin de toutes les DLL référencées et de leur arborescence de dépendance dans le dossier de sortie de mon fichier EXE. Je peux le faire, par exemple, en cochant les dépendances sur "Copier en local" dans la fenêtre des propriétés, mais cela ne fonctionne que pour les références directes du projet EXE, ce qui est loin d'être suffisant. Un autre moyen est de créer un projet d’installation, mais mon client et moi-même voulons éviter cela (dans la version finale, je vais utiliser ClickOnce). Bien sûr, je peux toujours le faire à la main, en rassemblant toutes les DLL manuellement, mais c'est un cauchemar.

Existe-t-il un outil, une astuce msbuild, une option de ligne de commande, quel que soit le moyen de forcer Visual Studio à rassembler l’arbre de dépendances complet de mon fichier EXE lors de la construction et à les copier dans le dossier de sortie? Pour pouvoir tout compresser et l'envoyer à mon client.

21
Zoltán Tamási

J'ai en fait choisi une solution un peu "moyenne", de la manière suivante.

  1. J'ai créé un projet d'installation "factice", sans rien définir, mais en ajoutant les résultats du projet (sortie principale, ressources localisées, contenu, etc.). C'était une tâche de 2 minutes de cette façon.
  2. J'ai construit le projet d'installation et obtenu le fichier MSI en sortie.
  3. J'ai extrait le contenu du fichier MSI dans un dossier spécifique, appelé par exemple "MyAppPortable". J'ai trouvé la solution ici . La commande en ligne de commande est

    msiexec/a "chemin_absolu_du_mon_put_MSI"/qb TARGETDIR = "chemin_absolu du chemin_my_desired_output"

  4. J'ai reçu l'application complète avec toutes ses dépendances résolues (à l'exception des dépendances de liaison tardive, mais je m'en suis occupé manuellement, en les ajoutant en tant que références à mes projets). Je pouvais compresser le dossier en entier, le placer sur un autre ordinateur et le tour était joué, tout fonctionnait bien.

1
Zoltán Tamási

Fondamentalement, à l'aide de Visual Studio, vous pouvez définir tous les projets de votre solution pour qu'ils soient générés dans le même dossier de sortie et utiliser ce dossier comme dossier de votre application Windows Form (où réside le fichier EXE de l'application).

Ce faisant, vous coordonnerez toutes les références d'assemblages possibles dont dépend votre application.

Dans VS 2012, cliquez avec le bouton droit sur un projet => Propriétés => Sélectionnez la construction (volet de gauche) => Définissez votre chemin de sortie:

Output path in VS 2012

Je choisirais un dossier au niveau de la solution comme chemin de sortie.

Et s'il est interdit d'effectuer une telle modification sur votre lieu de travail, je vous suggère donc d'utiliser des outils d'analyse des dépendances afin d'interroger et de rassembler les assemblys appropriés dont dépend votre application et dont vous aurez besoin au moment de l'exécution:

Mettre à jour:

L'utilisation des outils mentionnés ci-dessus ne générera pas de références d'assemblages tardives (au moment de l'exécution). Dans ce cas, vous pouvez utiliser: Fusion (la visionneuse du journal d'assemblage)

1
Yair Nevet

Consultez la recommandation Fody/Costura de cette question: Incorporation de DLL dans un exécutable compilé

C'est bien! Je viens de l'essayer pour un besoin similaire et en moins de quelques minutes, j'avais un exe complètement portable (à l'exception du framework .Net) que je pouvais facilement donner à des collègues.

0
Matt Penner