web-dev-qa-db-fra.com

Comment inclure une bibliothèque dans .NET Core 2.0

Je ne sais pas encore grand chose sur .NET, donc je suppose que je manque quelque chose d'évident.

J'ai créé une bibliothèque (ciblée en tant que dll, définie pour .NET standard 2.0), je l'ai empaquetée à la fois en tant que dll et en tant que package nuget. Maintenant, je veux utiliser la bibliothèque dans un autre projet, sur ASP.NET Core 2.0. Comment dois-je procéder?

Je suis actuellement sur une machine virtuelle Linux, donc j'utilise VS Code, donc je préférerais une solution sans utiliser Visual Studio complet. J'ai essayé quelques solutions en utilisant Visual Studio complet, mais cela n'a pas fonctionné pour moi, car je n'ai trouvé nulle part l'explorateur de référence.

12
MrMid

Vous devrez référencer votre bibliothèque dans le fichier csproj

enter image description here

Un fichier csproj vide ressemblerait à ceci:

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

</Project>

Maintenant, vous pouvez avoir deux types de références

Référence du projet - Vous avez un projet qui sert de bibliothèque de classes dans votre solution et vous souhaitez le référencer directement

<ProjectReference Include="..\..\src\mylib.csproj" />

Référence du package - Vous avez un lien vers un package NuGet

<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="1.1.2" />

À l'intérieur de votre fichier csproj, les références doivent être à l'intérieur d'un bloc "ItemGroup", chaque type de référence doit avoir son propre "ItemGroup"

Voici un exemple de fichier csproj avec quelques références de package et quelques références de projet

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.1.0" />
    <PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="1.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="1.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.1" />
    <PackageReference Include="xunit" Version="2.2.0" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\..\src\mylib.csproj" />
    <ProjectReference Include="..\..\src\mylib2.csproj" />
  </ItemGroup>
</Project>
14
areller

Beaucoup de gens recommandent l'une des deux solutions:

1) Copiez la bibliothèque dans votre dossier de solution.

cp -r foo/foo ./foo
dotnet sln add foo/foo.csproj
cd bar
dotnet add reference ../foo/foo.csproj

C'est une terrible solution.

Ne faites pas cela (c.-à-d. Copiez et collez le code de votre bibliothèque chaque fois que vous voulez l'utiliser, mauvais pour des raisons évidentes).

2) Configurez un référentiel de pépites local, copiez votre bibliothèque dans le référentiel local, puis ajoutez-le.

nuget add -name "Local" -source /home/doug/packages
nuget add ~/foo/foo.nupkg -source /home/doug/packages

Installez ensuite le package:

cd bar
dotnet add package foo

C'est une solution acceptable, mais le flux de travail est assez irritant si vous travaillez activement sur votre bibliothèque (foo), car le -source le chemin doit être absolu.

-

Je vous recommande de regarder dotnet add package with local package file , qui explique comment vous pouvez avoir un cache local de tous les fichiers nupkg personnalisés avec lesquels vous souhaitez travailler.

Fondamentalement, déposez-le simplement dans votre dossier de solution:

NuGet.Config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <packageSources>
    <add key="local" value="./packages" />
 </packageSources>
</configuration>

(notez que ./packages est un chemin relatif, qui fonctionnera même lorsque vous extrayez votre projet sur une machine ou un système d'exploitation entièrement différent)

Maintenant, si vous appelez dotnet add package X il recherchera également tout fichier appelé x.nupkg dans votre ./packages/ dossier.

Maintenant, si vous souhaitez utiliser une bibliothèque locale personnalisée, il vous suffit de:

cp ~/foo/foo.nupkg ./packages
cd bar
dotnet add package foo

<3

(Remarque: par défaut, nuget met en cache vos fichiers .nupkg dans ~/.nuget et restaure les packages de ce dossier si vous appelez dotnet add package X, même si vous avez un autre X.nupkg dans votre dossier local ./packages. Vous pouvez trouver la commande dotnet nuget locals all --clear utile si vous rencontrez un comportement étrange pour vous assurer d'obtenir la version exacte du nupkg que vous voulez, pas une version en cache arbitraire)

13
Doug

Étant donné que la DLL que vous souhaitez référencer dans le nouveau projet ASP.NET Core 2.0 est relativement récente, je pense que vous devrez apporter des modifications à cette version originale DLL que vous développez le projet ASP.Net.

Dans cette situation, j'ajouterais le projet DLL DLL d'origine dans le cadre de la solution ASP.Net afin que vous puissiez travailler sur les deux ensembles de code source, y compris la définition de points d'arrêt dans le même espace de travail de la solution.

L'emballage NUGET du projet DLL DLL d'origine peut être retardé jusqu'à ce que la première version de votre solution combinée soit stabilisée et que vous souhaitiez rendre cela DLL disponible pour un plus grand) public de développeurs au-delà de la portée de votre application ASP.NET.

1
camelCase

Une autre façon de référencer le package local dans le fichier .csproj:

<ItemGroup>

 <Reference Include="MyAssembly">

   <HintPath>path\to\MyAssembly.dll</HintPath>

 </Reference>
</ItemGroup>
1
simon w

Une solution divine sera d'ajouter la bibliothèque (fichier .dll) que vous souhaitez utiliser aux références du projet de votre projet dans lequel vous souhaitez utiliser la bibliothèque:

Clic droit sur le projet -> Ajouter -> Référence -> Projet -> Parcourir -> Path_to_your_generated_library (.dll)

Cela générera automatiquement le nœud suivant dans le fichier .csproj:

<ItemGroup>
   <Reference Include="DotNetCoreClassLibraryCodeParser">
      <HintPath>..\..\DotNetCoreClassLibrary\DotNetCoreClassLibrary\bin\Debug\netcoreapp2.1\DotNetCoreClassLibrary.dll</HintPath>
   </Reference>
 </ItemGroup>

J'espère que ça aide.

0
cristian