8
votes

Comment inclure des fichiers nécessitaires à la sortie du projet client indépendant?

Ma solution consiste en:

client - projet de démarrage, couche d'interface utilisateur. Dépend de: app

app - bibliothèque, couche d'application, assembleur. Dépend de: lib1 , ...

lib1 - bibliothèque, couche logique commerciale. A besoin d'un fichier spécifique pour fonctionner correctement: tiersparty.dll

J'ai ajouté tiersparty.dll au projet lib1 ( ajouter > élément existant ... > Ajouter ) et définir Copier dans le répertoire de sortie Propriété du fichier DLL sur Copier toujours . Maintenant, le fichier DLL est copié dans la sortie lib1 et à la sortie , mais pas sur la sortie où j'en ai besoin pour être.

Quel est le moyen (simple? évident?) moyen de copier tiersparty.dll à la sortie du client sur chaque solution de la solution?

upd tiersparty.dll n'est pas une référence. En fait, c'est une autre dépendance de référence. Ma question est appliquée à n'importe quel fichier qui doit être dans le dossier de l'exécution de l'application.

Vidéo enregistrée pour être sûr que je vais bien je le fais bien: http://youtu.be/qws2toic5yq < / p>


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser (dans Visual Studio) Lib1 Propriétés Propriétés -> Construire des événements -> Ligne de commande d'événement post-construction.

dans la "ligne de commande d'événement post-construction" Type de boîte copie Commandes qui copieront les fichiers requis dans le dossier de sortie du client. Dans cette éditeur, vous pouvez utiliser diverses macros VS (cliquez sur "Modifier la version postale" -> macros) Comme ceci: xxx

Peut-être, vous devrez "construire" -> "Solution de reconstruction" à la première fois.


2 commentaires

La mauvaise chose est que lib1 devient dépendant du projet du client . Je pense que cela est faux de la même manière que la fabrication dépend de tous ces fichiers tiers. Si vous choisissez entre toutes les mauvaises solutions, je préférerais ajouter tous les fichiers au client (add => article existant ...)


Dans tous les cas, le client dépend de la lib1 (via l'application). Si vous n'avez pas besoin de dépendances à partir de projets et de créer des actions, copiez simplement manuellement toutes vos ressources tierces vers le dossier de sortie. Ou utilisez une étape de création de poche sur le client qui copiera toutes les choses au répertoire du client.



4
votes

C'est facile et il est étrange que cela ne fonctionnait pas pour vous. Je viens de vérifier et cela fonctionne:

  1. Ajouter tiersparty.dll code> au projet lib code>. li>
  2. L'action de construction code> doit être définie sur contenu code> (la valeur par défaut) !!! li>
  3. SET Copier sur le répertoire de sortie code> à Copier si plus récent code> ou copie toujours code> li>
  4. référence lib code> à partir de app code> li>
  5. référence app code> à partir de client code> li> ol>

    Cela fonctionne dans Visual Studio 2012, mais ne semble pas fonctionner dans Visual Studio 2010. P>

    VS2010: P>

    ============================================================
                                        GetCopyToOutputDirectoryItems
    
    Get all project items that may need to be transferred to the output directory.
    This includes baggage items from transitively referenced projects. It would appear
    that this target computes full transitive closure of content items for all referenced
    projects; however that is not the case. It only collects the content items from its
    immediate children and not children of children. The reason this happens is that
    the ProjectReferenceWithConfiguration list that is consumed by _SplitProjectReferencesByFileExistence
    is only populated in the current project and is empty in the children. The empty list
    causes _MSBuildProjectReferenceExistent to be empty and terminates the recursion.
    ============================================================
    


6 commentaires

Êtes-vous sûr que après la construction de la solution tiersparty.dll est copié dans la sortie du client ? Je le vois dans App Sortie du projet uniquement.


Oui, je suis sûr. J'ai spécifiquement vérifié. (J'ai utilisé une image cependant, pas un fichier .dll.). Êtes-vous sûr que l'action Build pour tierspary.dll est définie sur contenu ? Je peux zip et partager ma solution (vs 2012) lorsque je rentre à la maison.


Oui, Build Action est contenu . Je suis en train d'utiliser vs2010 - cela pourrait être un bug? Regardez ma vidéo, tout est très simple: YouTu.be/qws2Oic5yq


Vous compliquez un peu les choses avec ce style de débogage. Supprimer le fichier juste aller sur le client bin / bin / débogage avec explorateur. Cliquez avec le bouton droit de la souris sur Client et sélectionnez Build , puis passez à l'explorateur et consultez les nouveaux fichiers.


J'ai confirmé que cela fonctionne dans VS2012, mais ne fonctionne pas dans VS2010. C'est un peu étrange et il est difficile de dire quelle version est buggy. Aucune version ne prend vraiment en charge les «articles de bagages provenant de projets référencés de manière transitoire», mais en quelque sorte vs2012 le fait. VS2012 saute quelques étapes de construction qui "étaient auparavant construits avec succès" ou parce que la propriété BuildingProject devient étrangement fausse. VS2010 exécute plus de cibles et perd d'une manière ou d'une autre manière des fichiers de contenu de petits-enfants dans le processus.


+1 Je ne pensais pas que cela a fonctionné parce que je n'avais utilisé que VS10. Cela fonctionne comme prévu dans VS12 / 13.



11
votes

Ajouter un élément existant en tant que lien: strong>

J'ai eu un problème similaire dans vs2010 cod> et j'ai un peu fini en ajoutant le fichier sous lien code> et mettre à jour sa propriété sur Copier toujours code>. P>

Dans votre cas, dans Client CODE> Projet, Ajouter tiersparty.dll code> comme link code> (ajouter> élément existant> Ajouter comme Link) et définir copier dans le répertoire de sortie code> Propriété du fichier DLL sur Copier toujours code>. note em>: il copierait la hiérarchie des dossiers du nœud de projet. p>

juste pour référence: em> J'utilisais réellement une source ouverte libgit2shaarp qui nécessitait une dll (libgit2.dll) à être disponible dans le répertoire de sortie. Par conséquent, dans la couche d'interface utilisateur, qui avait ajouté une couche d'application contenant libgit2shaarp.dll code> comme référence; Je devais ajouter libgit2.dll code> sous forme de lien code> code> + copier toujours code>. Ceci a été recommandé une solution. P>

POST Build: strong> p>

L'autre option pourrait être d'écrire des scripts de publication pour Client code>

savoir comment le copier code> sur msbuild code> fonctionne, vous pouvez vous reporter à Microsoft.common.targets code> (doit être disponible @ C: \ Windows \ Microsoft.net \ Framework \ V4.0.30319 \ Microsoft.common.Targets dans votre système) P>

<Target
        Name="CopyFilesToOutputDirectory"
        DependsOnTargets="
            ComputeIntermediateSatelliteAssemblies;
            _CopyFilesMarkedCopyLocal;
            _CopySourceItemsToOutputDirectory;
            _CopyAppConfigFile;
            _CopyManifestFiles;
            _CheckForCompileOutputs;
            _SGenCheckForOutputs">


4 commentaires

@astef Installing Visual Studio 2012 qui n'a pas ce bogue est un peu mieux =)


@JaCOB Si vous avez une bonne compréhension de la manière dont les objectifs standard Msbuild sont entrelacés dans une construction Visual Studio, vous pouvez peut-être examiner ce cas et essayer de déterminer pourquoi les comportements VS2012 et VS2010 divergent lorsqu'ils construisent le même projet. Voir ma réponse pour les parties pertinentes du journal: Stackoverflow.com/a/16848316/1497385


@ Ark-kun: Comme je le vois, VS2010 utilise Msbuild de .NET4.0 et VS2012 utilise 4.5. Je n'ai pas eu de chance d'avoir la chance de travailler sur VS2012, vérifiera sûrement cela ..


Il n'y a qu'un seul msbuild.exe avec .NET 4.0 et .NET 4.5 - C: \ Windows \ microsoft.net \ framework \ v4.0.30319 \ msbuild.exe . Il n'y a pas de C: \ Windows \ Microsoft.net \ Framework \ v4.5. * \. Également vs 2012 utilise c: \ windows \ microsoft.net \ framework \ v4.0.30319 \ microsoft.commez sur.targets - le même que vs 2010.