web-dev-qa-db-fra.com

Référencement d'une bibliothèque .NET Standard à partir d'une bibliothèque de classes Windows

Il existe actuellement deux projets dans ma solution: une Bibliothèque de classes Windows (ciblant .NET Framework 4.6.1) et une autre bibliothèque de classes qui cible .NET Standard 1.3. I'm à l'aide de Visual Studio 2015 Update 3.

J'ai ajouté une référence au projet .NET Standard de l'autre projet et elle apparaît dans la liste des références, mais je ne vois aucune des classes ou des espaces de noms de la bibliothèque référencée lorsque je veux les utiliser (même si la bibliothèque référencée a été créée avec succès et ne contient aucune erreur).

Voici le project.json du projet de bibliothèque .NET Standard:

{
  "version": "1.0.0-*",

  "dependencies": {
    "NETStandard.Library": "1.6.0"
  },

  "frameworks": {
    "netstandard1.3": {
      "imports": "dnxcore50"
    }
  }
}

Je pensais que les projets .NET 4.6.1 pouvaient utiliser les bibliothèques .NET Standard 1.3, et j'ai même essayé d'utiliser des versions inférieures (1.0), mais le résultat est le même. Qu'est-ce que j'oublie ici?

Si je cours

restauration dotnet

cela fonctionne aussi très bien:

log  : Restoring packages for C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Entities\project.json...
log  : Restoring packages for C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\project.json...
log  : Writing lock file to disk. Path: C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\project.lock.json
log  : C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\PWBSpreadsheet.Parser.xproj
log  : Restore completed in 408ms.
log  : Writing lock file to disk. Path: C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Entities\project.lock.json
log  : C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Entities\PWBSpreadsheet.Entities.xproj
log  : Restore completed in 417ms.
17
Bedford

Référencer un projet .NET Core à partir d'une bibliothèque de classes Windows devrait être possible. Cependant, la bibliothèque .NET Standard n'est pas "directement compatible" avec les versions précédentes de .NET Framework, c'est-à-dire 4.6.1 ou inférieures. La bibliothèque .NET Standard est un package avec des composants qui existent déjà dans le .NET Framework (4.6.1 par exemple). La différence est que la bibliothèque .NET Standard est conçue pour le framework multiplateforme .NET Standard.

Vous pouvez cibler plusieurs cadres sous "frameworks" section dans votre fichier project.json.

Ce faisant, vous devez également déplacer le "NETStandard.Library"- dépendance directement sous "netstandard1.x"-cadre.

Exemple de projet.json

{
  "version": "1.0.0-*",

  "dependencies": { },

  "frameworks": {
    "net461": { },
    "netstandard1.3": {
      "dependencies": {
        "NETStandard.Library": "1.6.0"
      },
      "imports": "dnxcore50"
    }
  }
}

Cela garantit que vous n'incluez aucune dépendance superflue vers la bibliothèque NET Standard car ces dépendances ne seront incluses que lors de la construction vers le framework NET Standard. Si elles sont construites avec .NET Framework 4.6.1, ces dépendances sont omises. C'est très bien, car ces dépendances font déjà partie du .NET Framework (comme décrit ci-dessus).

Supposons maintenant, par exemple, que vous souhaitez référencer quelque chose qui est pas une partie de la bibliothèque .NETStandard, mais une partie du framework .NET 4.6.1. Un cas courant pour cela sur mon lieu de travail est System.ComponentModel.DataAnnotations. Il fait partie du .NET Framework, mais un package distinct pour le .NET Standard Framework.

Vous devrez ensuite le référencer comme un Assembly Framework pour "net461", mais en tant que dépendance pour le "netstandard1.x" cadre.

Exemple de projet.json

"frameworks": {
  "net461": {
    "frameworkAssemblies": {
      "System.ComponentModel.DataAnnotations": "4.0.0.0"
    }
  },
  "netstandard1.3": {
    "dependencies": {
      "NETStandard.Library": "1.6.0",
      "System.ComponentModel.Annotations": "4.1.0"
    },
    "imports": "dnxcore50"
  }
}

Comme le décrit @meziantou:

Le référencement de .NET Standard dans un projet qui cible le framework complet ne fonctionne pas encore correctement.

Je viens de le tester dans Visual Studio 2015 et je peux le confirmer: la référence est ajoutée, mais vous ne pouvez utiliser aucun composant de la bibliothèque référencée.

Si vous n'avez pas installé Visual Studio 2017, la seule solution à laquelle je peux penser est de dotnet pack votre projet et publiez-le dans un flux NuGet. Vous pouvez configurer n flux NuGet local à cet effet.

Utilisez ensuite simplement le Install-Package applet de commande dans la console du gestionnaire de packages NuGet.

Install-Package <your-package> -v 1.0.0-<x>

Le gestionnaire de packages fera référence à la version correcte du package (.NET 4.6.1).

17
die maus

Référencer .NET Standard dans un projet qui cible le framework complet ne fonctionne pas encore correctement. Au lieu de cela, votre projet doit cibler plusieurs cadres.

Si vous utilisez le nouvel outil (avec VS 2017), c'est-à-dire le format de projet csproj, vous pouvez définir plusieurs cibles dans la balise TargetFrameworks:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.3;net46</TargetFrameworks>
  </PropertyGroup>
</Project>

Si nécessaire, vous pouvez définir différentes dépendances pour chaque cible:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.3;net46</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.3'">
    <PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" />
    <PackageReference Include="System.Collections" Version="4.3.0" />
    <PackageReference Include="System.Runtime.InteropServices" Version="4.3.0" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net46'">
    <PackageReference Remove="NETStandard.Library" />
  </ItemGroup>
</Project>

Par défaut, le NETStandard.Library est automatiquement ajouté. Si vous souhaitez le supprimer, utilisez PackageReference Remove="NETStandard.Library"/>.

18
meziantou

Vous ne pouvez pas utiliser certaines bibliothèques dans des projets PCL car il n'est pas construit en tant que PCL et il n'est pas multiplateforme. Certains espaces de noms ne sont pas disponibles dans les projets PCL et ne sont pas répertoriés ici .

Les assemblys suivants sont disponibles dans un projet de bibliothèque de classes portable:

mscorlib.dll

System.dll

System.Core.dll

System.Xml.dll

System.ComponentModel.Composition.dll

System.Net.dll

System.Runtime.Serialization.dll

System.ServiceModel.dll

System.Xml.Serialization.dll

System.Windows.dll (from Silverlight)

Cependant, tous ces assemblys ne sont pas pris en charge sur toutes les plates-formes.

2
Salah Akbari