web-dev-qa-db-fra.com

Les DLL dépendantes d'un package NuGet non copiées dans le dossier de sortie

J'ai eu un problème avec un paquet Nuget personnalisé que j'ai créé. Appelons cela MyCompany.Library.nupkg. Il est hébergé sur un dépôt Artifactory Nuget d’entreprise. Ce paquet dépend de Newtonsoft.Json. Pour une raison quelconque, la DLL dépendante n'est pas copiée dans le dossier de sortie de mon projet si je fais référence à un projet utilisant ce package Nuget. Ce qui est étrange, c'est que lorsque j'utilise un autre package (par exemple, Moq, au lieu du mien), les DLL dépendantes sont copiées.

J'ai créé une solution de test pour reproduire le problème:

Solution ReferenceTest:

  • Projet: SomeLib.dll; références:
    • MyCompany.Library Nupkg (dépend de Newtonsoft.Json, donc ajouté aussi)
    • Moq Nupkg (dépend de Castle.Core, ajouté aussi)
  • Projet: MyWinFormsApp.exe; référence du projet:
    • SomeLib.csproj

Quand je regarde le dossier de sortie de SomeLib, je vois:

  • SomeLib.dll
  • Moq.dll
  • Castle.Core.dll
  • MyCompany.Library.dll
  • Newtonsoft.Json.dll

Ça à l'air bon.

Mais lorsque je regarde le dossier de sortie de MyWinFormsApp, Newtonsoft.Json.dll est manquant et lors de l'exécution de l'application, il génère des exceptions indiquant que la dll Newtonsoft.Json est introuvable. Cependant, Castle.Core.dll IS dans le dossier de sortie de MyWinFormsApp.

J'ai comparé les nuspecs de Moq et de MyCompany.Library et je ne trouve pas vraiment de différence significative.

Je pourrais changer tous les projets qui utilisent ma SomeLib pour faire référence à Newtonsoft.Json, mais cela fait beaucoup de projets et je ne veux pas déranger les autres développeurs avec ça. Ils ne devraient pas avoir à savoir que SomeLib utilise cette Assemblée.

Les références dans SomeLib.csproj sont comme ceci:

  <ItemGroup>
    <Reference Include="MyCompany.Library, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
      <HintPath>..\packages\MyCompany.Library.1.0.0\lib\net461\MyCompany.Library.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="Castle.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
      <HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="Moq, Version=4.5.28.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
      <HintPath>..\packages\Moq.4.5.28\lib\net45\Moq.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>..\packages\Newtonsoft.Json.8.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />
  </ItemGroup>

Mon Nuspec ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.Microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <id>MyCompany.Library</id>
    <version>0.0.0</version>
    <description>MyCompany Core library</description>
    <authors>MyCompany</authors>
    <references>
      <reference file="MyCompany.Library.dll" />
    </references>
    <dependencies>
      <dependency id="Newtonsoft.Json" version="[8.0,9.0.1]" />
    </dependencies>    
  </metadata>
  <files>
    <file src="MyCompany.Library\bin\Release\MyCompany.Library.dll" target="lib\net461"/>
    <file src="MyCompany.Library\bin\Release\MyCompany.Library.pdb" target="lib\net461"/>
    <file src="MyCompany.Library\bin\Release\MyCompany.Library.xml" target="lib\net461"/>
  </files>
</package>

J'utilise Visual Studio 2015 Professional.

Mes questions:

  1. Pourquoi Visual Studio ne copie-t-il pas ma dll dépendante?
  2. Pourquoi copie-t-il les dépendances de Moq? Quelle est la différence?

Merci pour toute aide.

Quido

MODIFIER

J'ai comparé le NUSPEC de Moq à mon propre paquet et (complètement désespéré), j'ai trouvé une différence. Le Moq Nuspec contient:

<dependencies>
  <group targetFramework=".NETFramework4.5">
    <dependency id="Castle.Core" version="3.3.3" />
  </group>
</dependencies>

et mon propre paquet contient:

<dependencies> 
  <dependency id="Newtonsoft.Json" version="[8.0,9.0.1]" /> 
</dependencies>     

J'ai changé ma dépendance pour spécifier un targetFramework et VisualStudio copie maintenant ma dépendance!

Ce NuSpec est la seule chose que j'ai changée et cela le résout vraiment. Je suis allé et vient à une situation avec et sans ce targetFramework et les résultats sont cohérents (échec sans le targetFramework et succès avec le targetFramework).

Donc: problème résolu, mais je ne sais pas pourquoi ...

13
Quido

1.Pourquoi Visual Studio ne copie-t-il pas ma dll dépendante?

Tout comme vous le commentez, MSBuild ne copie pas les références (fichiers DLL) si vous utilisez des dépendances de projet dans une solution afin d'éviter une pollution de référence dans le projet SomeLib du projet. Ainsi, les références du projet référencé ne seront pas copiées dans le dossier de sortie.

2.Pourquoi est-ce qu'il copie les dépendances de Moq? Quelle est la différence?

Comme réponse à la première question, les dépendances de Moq ne doivent pas être copiées dans le dossier de sortie de MyWinFormsApp. Vous devez donc vérifier si vous avez installé le package Moq dans le projet MyWinFormsApp et vérifier les références de MyWinFormsApp. Assurez-vous de n'avoir qu'une référence de projet du projet SomeLib.

J'espère que cela peut vous aider.

1
Leo Liu-MSFT

Faites un clic droit sur la référence "Newtonsoft.json" dans le projet et sélectionnez Propriétés . Dans la page de propriétés, vérifiez si la propriété "Copier local" est définie sur "Vrai".

0
Pankaj Kapare