239 votes

La DLL dépendante n'est pas copiée dans le dossier de sortie de la compilation dans Visual Studio.

J'ai une solution Visual Studio. J'ai plusieurs projets dans cette solution. Il y a un projet principal qui agit comme le démarrage et utilise d'autres projets. Il y a un projet appelé "ProjectX". Sa référence est ajoutée au projet principal. Le ProjectX fait référence à une autre dll .NET (disons abc.dll) qui ne fait pas partie de la solution.

Maintenant, cette abc.dll devrait être copiée dans le dossier bin/debug du projet principal, mais elle n'y est pas copiée. Pourquoi n'est-elle pas copiée, y a-t-il des raisons connues ?

2 votes

Si vous n'y arrivez pas, copiez-le dans votre pré-construction.

1 votes

Comment utilisez-vous votre "ProjetX" dans le projet principal - quel est le type de projet, la cible, etc.

2 votes

J'ai eu le même problème et cette réponse l'a résolu : stackoverflow.com/a/8213977/174469

3voto

GR7 Points 1330

Dans mon cas, c'était la chose la plus stupide, causée par un comportement par défaut de TFS/VS avec lequel je ne suis pas d'accord.

Puisque l'ajout de la dll comme référence au projet principal ne fonctionnait pas, j'ai décidé de l'ajouter comme "élément existant", avec Copy Local = Always. Même dans ce cas, le fichier n'était pas là.

Il s'avère que, même si le fichier est présent dans la solution VS et que tout a été compilé à la fois localement et sur le serveur, VS/TFS n'a pas réellement ajouté le fichier au contrôle de source. Il n'était pas du tout inclus dans les "Pending Changes". J'ai dû aller manuellement dans l'explorateur de contrôle de source et cliquer explicitement sur l'icône "Ajouter des éléments au dossier".

C'est stupide parce que je développe depuis 15 ans en VS. J'ai déjà rencontré ce problème auparavant, mais je ne m'en souvenais pas et, d'une manière ou d'une autre, je l'ai manqué parce que tout compilait toujours parce que le fichier était une référence normale, mais le fichier qui a été ajouté comme élément existant n'était pas copié parce qu'il n'existait pas sur le serveur de contrôle de source.

J'espère que cela fera gagner du temps à quelqu'un, puisque j'ai perdu deux jours de ma vie à cause de cela.

1 votes

Je ne vous remercierai jamais assez... vous m'avez fait gagner beaucoup de temps. C'était la solution pour moi. Elle a également mis en évidence le problème de base, la DLL que j'ai ajoutée en tant que référence correspondait à un fichier gitignore de sorte que lorsqu'il a été ajouté en tant que référence, il n'a pas été ajouté au projet. Vous DEVEZ ajouter manuellement le fichier au contrôle de la source !!!

2voto

maca134 Points 41

Il s'agit d'une légère modification de l'exemple de nvirth.

internal class DummyClass
{
    private static void Dummy()
    {
        Noop(typeof(AbcDll.AnyClass));
    }
    private static void Noop(Type _) { }
}

2voto

chethan jain Points 91

Je voudrais ajouter aux événements de Postbuild de copier les bibliothèques nécessaires dans les répertoires de sortie. Quelque chose comme XCopy pathtolibraries targetdirectory

Vous pouvez les trouver dans les propriétés du projet -> Build Events.

0 votes

Cela a fonctionné pour moi, et je pense que c'est la meilleure réponse. La solution de la référence fictive fonctionne, mais c'est un hack, alors qu'une règle post-construction est un moyen propre d'obtenir le même résultat.

2voto

Eric Patrick Points 1212

TLDR ; Visual Studio 2019 peut simplement avoir besoin d'un redémarrage.

J'ai rencontré cette situation en utilisant des projets basés sur le projet Microsoft.NET.Sdk.

<Project Sdk="Microsoft.NET.Sdk">

Plus précisément :

  • Project1 : cibles .netstandard2.1
    • références Microsoft.Extensions.Logging.Console via Nuget
  • Project2 : cibles .netstandard2.1
    • références Project1 via une référence de projet
  • Project2Tests : cibles .netcoreapp3.1
    • références Project2 via une référence de projet

Lors de l'exécution du test, j'ai reçu le message d'erreur indiquant que Microsoft.Extensions.Logging.Console n'a pas pu être trouvé, et c'était en effet no dans le répertoire de sortie.

J'ai décidé de contourner le problème en ajoutant Microsoft.Extensions.Logging.Console à Project2 pour découvrir que le gestionnaire de Nuget de Visual Studio n'a pas listé Microsoft.Extensions.Logging.Console tel qu'installé dans Project1 malgré sa présence dans le Project1.csproj fichier.

Un simple arrêt et redémarrage de Visual Studio a permis de résoudre le problème sans qu'il soit nécessaire d'ajouter une référence supplémentaire. Cela permettra peut-être à quelqu'un d'économiser 45 minutes de productivité perdue :-)

0 votes

En fait, j'ai redémarré tout le PC pour tester les choses, mais cela a fonctionné pour moi.

0 votes

J'ai le même problème avec le projet SDK .NET5, j'ai essayé cette solution mais malheureusement cela n'a pas fonctionné pour moi, même après avoir redémarré le PC :(

1voto

YantingChen Points 31

Vous pouvez définir à la fois le projet principal et le chemin de sortie de construction de ProjectX dans le même dossier, alors vous pouvez obtenir toutes les dlls dont vous avez besoin dans ce dossier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X