J'ai une solution de studio visuel. J'ai de nombreux projets dans la solution. Il y a un projet principal qui sert de start-up et utilise d'autres projets. Il y a un projet dit "ProjectX". Sa référence est ajoutée au projet principal. ProjectX fait référence à une autre dll .NET (disons abc.dll) qui ne fait pas partie de la solution.
Maintenant, ce abc.dll doit être copié dans le dossier bin / debug du projet principal, mais il n'y est pas copié. Pourquoi n'est-il pas copié, pour des raisons connues?
RestoreProjectStyle
solution disponible . L'idée est de définir<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
pour chaque projet .Net Framework de la solution.Réponses:
J'ai trouvé que si ProjectX faisait référence à l'abc.dll mais n'utilisait directement aucun des types DEFINIS dans abc.dll, alors abc.dll ne serait PAS copié dans le dossier de sortie principal. (Il serait copié dans le dossier de sortie de ProjectX, pour le rendre encore plus déroutant.)
Donc, si vous n'utilisez explicitement aucun des types de abc.dll n'importe où dans ProjectX, placez une déclaration factice quelque part dans l'un des fichiers de ProjectX.
Vous n'avez pas besoin de le faire pour chaque classe - une seule fois suffira pour que la copie DLL et tout fonctionne comme prévu.
Addendum: Notez que cela peut fonctionner pour le mode de débogage, mais PAS pour la version. Voir la réponse de @ nvirth pour plus de détails.
la source
Juste un commentaire sur la réponse d'Overlord Zurg.
J'ai ajouté la référence factice de cette façon, et cela a fonctionné en mode débogage:
Mais en mode Release, la DLL dépendante n'a toujours pas été copiée.
Cela a fonctionné cependant:
Cette information m'a en fait coûté des heures à comprendre, alors j'ai pensé la partager.
la source
AbcDll.AnyClass
est utilisé comme un champ public ou une propriété sur une classe publique, alors cela fonctionnera. Si vous l'utilisez dans un corps de méthode comme celui-ci, le compilateur ne le voit pas . Cela retardera le chargement de cet assemblage, pas ce que vous voulez.Oui, vous devrez définir
Copy Local
surtrue
. Cependant, je suis à peu près sûr que vous devrez également référencer cet assemblage à partir du projet principal et définirCopy Local
surtrue
aussi bien - il ne sont pas simplement copiés à partir d' un assemblage dépendant.Vous pouvez accéder à la
Copy Local
propriété en cliquant sur l'assemblage sousReferences
et en appuyant sur F4.la source
Il a l'air élégant lorsque vous en faites un attribut d'assemblage
L'utilisation sera:
la source
Ran dans ce même problème. Informations de fond: avant de construire, j'avais ajouté un nouveau Project X à la solution. Le projet Y dépendait du projet X et le projet A, B, C dépendait du projet Y.
Les erreurs de construction étaient que les DLL du projet A, B, C, Y et X étaient introuvables.
La cause première était que le projet X nouvellement créé ciblait .NET 4.5 tandis que le reste des projets de solution ciblait .NET 4.5.1. Le projet X n'a pas été construit, ce qui a empêché le reste des projets de se construire.
Assurez-vous que tous les projets nouvellement ajoutés ciblent la même version .NET que le reste de la solution.
la source
Je ne sais pas si cela aide, mais pour moi, je référence souvent une DLL (qui l'ajoute automatiquement au dossier bin bien sûr). Cependant, cette DLL peut avoir besoin de DLL supplémentaires (en fonction des fonctions que j'utilise). Je ne veux PAS faire référence à ceux-ci dans mon projet car ils doivent simplement se retrouver dans le même dossier que la DLL que j'utilise réellement.
J'accomplis cela dans Visual Studio en «ajoutant un fichier existant». Vous devriez pouvoir l'ajouter n'importe où sauf dans le dossier Add_data. personnellement, je l'ajoute simplement à la racine.
Puis changez les propriétés de ce fichier en ...
Build Action = None (avoir cette valeur à quelque chose comme Content copie en fait la version "root" à la racine, plus une copie dans le Bin).
Copier dans le dossier de sortie = Copier si plus récent (le met essentiellement dans le dossier BIN uniquement s'il manque, mais ne le fait pas après cela)
Quand je publie .. mes DLL ajoutées existent uniquement dans le dossier BIN et nulle part ailleurs dans l'emplacement de publication (ce que je veux).
la source
Vous pouvez également vérifier que les DLL que vous recherchez ne sont pas incluses dans le GAC. Je pense que Visual Studio est intelligent pour ne pas copier ces fichiers s'ils existent déjà dans le GAC sur la machine de génération.
J'ai récemment couru dans cette situation où j'avais testé un package SSIS qui avait besoin d'assemblys pour exister dans le GAC. J'avais oublié cela depuis et je me demandais pourquoi ces DLL ne sortaient pas pendant une construction.
Pour vérifier ce qu'il y a dans le GAC (à partir d'une invite de commande de développeur Visual Studio):
Ou sortie dans un fichier pour en faciliter la lecture:
Pour supprimer un assemblage:
Je dois également noter qu'une fois que j'ai supprimé les fichiers du GAC, ils étaient correctement sortis dans le répertoire \ bin après une construction (même pour les assemblys qui n'étaient pas directement référencés dans le projet racine). C'était sur Visual Studio 2013 Update 5.
la source
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 n'a pas fonctionné, j'ai décidé de l'ajouter en tant qu '"élément existant", avec Copier local = Toujours. Même alors, le fichier n'était pas là.
Il s'avère que, même si le fichier est présent sur la solution VS et que tout est compilé à la fois localement et sur le serveur, VS / TFS n'a pas ajouté réellement le fichier au contrôle de code source. Il n'était pas du tout inclus dans les "Modifications en attente". J'ai dû accéder manuellement à l'explorateur de contrôle de source et cliquer explicitement sur l'icône «Ajouter des éléments au dossier».
Stupide car je développe depuis 15 ans en VS. J'ai déjà rencontré cela auparavant, je ne m'en souvenais tout simplement pas et je l'ai manqué parce que tout était encore compilé parce que le fichier était une référence régulière, mais le fichier qui a été ajouté en tant qu'élément existant n'était pas copié car il n'existait pas sur le serveur de contrôle de source.
J'espère que cela fera gagner du temps à quelqu'un, car j'ai perdu 2 jours de ma vie à cause de cela.
la source
gitignore
modèle, donc lors de l'ajout comme référence, elle n'a pas été ajoutée au projet. Vous DEVEZ ajouter manuellement le fichier au contrôle de source !!!Ceci est une légère modification de l'exemple de nvirth
la source
Je l'ajouterais aux événements Postbuild pour copier les bibliothèques nécessaires dans les répertoires de sortie. Quelque chose comme XCopy pathtolibraries targetdirectory
Vous pouvez les trouver sur les propriétés du projet -> Créer des événements.
la source
Problème:
Rencontré avec un problème similaire pour une DLL de package NuGet (Newtonsoft.json.dll) où la sortie de génération n'inclut pas la DLL référencée. Mais la compilation se déroule bien.
Réparer:
Parcourez vos projets dans un éditeur de texte et recherchez des références contenant des balises. Comme vrai ou faux. «Privé» est synonyme de «Copier local». Quelque part dans les actions, MSBuild prend pour localiser les dépendances, il trouve votre dépendance ailleurs et décide de ne pas la copier.
Alors, parcourez chaque fichier .csproj / .vbproj et supprimez les balises manuellement. Reconstruisez et tout fonctionne à la fois dans Visual Studio et MSBuild. Une fois que cela fonctionne, vous pouvez revenir et mettre à jour le où vous pensez qu'il doit être.
Référence:
https://www.paraesthesia.com/archive/2008/02/13/what-to-do-if-copy-local-works-in-vs-but.aspx/
la source
PAS BESOIN DE DUMMY DANS LE CODE
Juste:
ou / et assurez-vous que la référence dans le projet exécutable est
"Copy Local"
définie surTRUE
(ce qui était ma " faute ") semble que cela "écrase" le paramètre dans le projet de bibliothèque référencé de base ...la source
Si vous cliquez avec le bouton droit sur l'assemblage référencé, vous verrez une propriété appelée Copier local . Si Copy Local est défini sur true, l'assembly doit être inclus dans le bac. Cependant , il semble y avoir un problème avec Visual studio, car parfois il n'inclut pas la dll référencée dans le dossier bin ... c'est la solution de contournement qui a fonctionné pour moi:
la source
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.
Plus précisément:
Project1
: cibles.netstandard2.1
Microsoft.Extensions.Logging.Console
via NugetProject2
: cibles.netstandard2.1
Project1
via une référence de projetProject2Tests
: cibles.netcoreapp3.1
Project2
via une référence de projetLors de l'exécution du test, j'ai reçu le message d'erreur indiquant que
Microsoft.Extensions.Logging.Console
cela ne pouvait pas être trouvé, et ce n'était en effet pas dans le répertoire de sortie.J'ai décidé de contourner le problème en ajoutant
Microsoft.Extensions.Logging.Console
àProject2
, uniquement pour découvrir que Nuget Manager de Visual Studio n'était pas répertoriéMicrosoft.Extensions.Logging.Console
comme installé dansProject1
, malgré sa présence dans leProject1.csproj
fichier.Un simple arrêt et redémarrage de Visual Studio a résolu le problème sans qu'il soit nécessaire d'ajouter une référence supplémentaire. Peut-être que cela permettra à quelqu'un d'économiser 45 minutes de perte de productivité :-)
la source
Vous pouvez définir à la fois le projet principal et le chemin de sortie de construction de ProjectX dans le même dossier, puis vous pouvez obtenir toutes les dll dont vous avez besoin dans ce dossier.
la source
Assurez-vous que la dll dépendante que vous utilisez n'a pas de framework .net cible supérieur au framework .net cible de l'application de votre projet.
Vous pouvez vérifier cela en sélectionnant votre projet, puis appuyez sur ALT + ENTRÉE, puis sélectionnez Application sur le côté gauche, puis sélectionnez Cadre cible de votre projet.
Supposons que le Framework cible de la DLL dépendante = 4.0 et le Framework cible de la DLL d'application = 3.5, changez-le en 4.0
Je vous remercie!
la source
Outre les plus courantes ci-dessus, j'avais une solution multi-projets à publier. Apparemment, certains fichiers ciblent différents frameworks.
Donc ma solution: Propriétés> Version spécifique (Faux)
la source
Ajoutez la DLL en tant qu'élément existant à l'un des projets et elle doit être triée
la source
VS2019 V16.6.3
Pour moi, le problème était que le fichier .proj principal se terminait par une entrée comme celle-ci pour le projet dont la DLL n'était pas copiée dans le dossier bin du projet parent:
J'ai supprimé manuellement la ligne
<Private>True</Private>
et la DLL a ensuite été copiée dans le dossier bin principal du projet sur chaque version du projet principal.Si vous accédez à la référence du projet problématique dans le dossier des références du projet principal, cliquez dessus et affichez les propriétés, il existe un paramètre "Copier local". La balise privée équivaut à ce paramètre, mais pour moi, pour une raison quelconque, la modification de la copie locale n'a eu aucun effet sur la balise privée dans le fichier .proj.
Malheureusement, je n'ai pas changé la valeur locale de copie pour la référence, aucune idée de la façon dont elle a été définie de cette façon et une autre journée perdue à traquer un problème stupide avec VS.
Merci à toutes les autres réponses qui m'ont aidé à me concentrer sur la cause.
HTH
la source