standard netstandard net library framework clases biblioteca c# .net portable-class-library .net-standard

c# - netstandard - net standard download



Referencia a una biblioteca estándar de.NET desde una biblioteca de clases de Windows (3)

Actualmente hay dos proyectos en mi solución: una biblioteca de clases de Windows (dirigida a .NET Framework 4.6.1) y otra biblioteca de clases dirigida a .NET Standard 1.3. Estoy usando la actualización 3 de Visual Studio 2015.

He agregado una referencia al proyecto .NET Standard del otro proyecto y aparece en la lista de referencias, pero no puedo ver ninguna de las clases o espacios de nombres de la biblioteca a la que se hace referencia cuando quiero usarlos (aunque la biblioteca de referencia se construyó correctamente y no tiene errores).

Este es el project.json para el proyecto de biblioteca estándar .NET:

{ "version": "1.0.0-*", "dependencies": { "NETStandard.Library": "1.6.0" }, "frameworks": { "netstandard1.3": { "imports": "dnxcore50" } } }

Pensé que los proyectos .NET 4.6.1 pueden usar .NET Standard 1.3 libs, e incluso intenté usar versiones más bajas (1.0), pero el resultado es el mismo. ¿Que me estoy perdiendo aqui?

Si corro

restauración dotnet

también funciona 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.


Hacer referencia a un proyecto de .NET Core desde una biblioteca de clases de Windows debería ser posible. Sin embargo, la biblioteca estándar de .NET no es "directamente compatible" con versiones anteriores de .NET Framework, es decir, 4.6.1 o inferior. La biblioteca estándar de .NET es un paquete con componentes que ya existen dentro de .NET Framework (4.6.1 por ejemplo). La diferencia es que la biblioteca estándar de .NET está construida para el marco estándar de .NET multiplataforma.

Puede dirigir múltiples marcos en la sección "frameworks" en su archivo project.json.

Al hacerlo, también debe mover la "NETStandard.Library" directamente debajo del marco "netstandard1.x" .

Ejemplo project.json

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

Esto garantiza que no incluya dependencias superfluas hacia la biblioteca NET Standard, ya que estas dependencias solo se incluirán cuando se construya hacia el marco NET Standard. Si se construye contra .NET Framework 4.6.1, estas dependencias se omiten. Esto está bien, ya que estas dependencias ya forman parte de .NET Framework (como se describe anteriormente).

Ahora digamos, por ejemplo, que desea hacer referencia a algo que no es parte de la biblioteca .NETStandard, sino parte del marco .NET 4.6.1. Un caso común para esto en mi lugar de trabajo es System.ComponentModel.DataAnnotations . Es parte de .NET Framework, pero es un paquete separado para el .NET Standard framework.

Luego tendrá que hacer referencia a él como un ensamblaje de marco para "net461" , pero como una dependencia para el marco de "netstandard1.x" .

Ejemplo project.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" } }

Como @meziantou describe:

La referencia a .NET Standard en un proyecto que se dirige al marco completo no funciona correctamente todavía.

Acabo de probarlo en Visual Studio 2015 y puedo confirmarlo: la referencia se agrega, pero no puede usar ningún componente de la biblioteca a la que se hace referencia.

Si no tiene instalado Visual Studio 2017, la única solución que se me ocurre es dotnet pack su proyecto mediante dotnet y publicarlo en un feed de NuGet. Puede configurar un feed de NuGet local para este propósito.

Luego simplemente use el cmdlet Install-Package en la consola del administrador de paquetes de NuGet.

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

El administrador de paquetes hará referencia a la versión correcta del paquete (.NET 4.6.1).


La referencia a .NET Standard en un proyecto que se dirige al marco completo no funciona correctamente todavía. En su lugar, su proyecto debe apuntar a múltiples marcos.

Si está utilizando las nuevas herramientas (con VS 2017), es decir, el formato del proyecto csproj, puede establecer múltiples objetivos en la etiqueta TargetFrameworks :

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

Si lo necesita, puede establecer diferentes dependencias para cada objetivo:

<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>

De forma predeterminada, se agrega automáticamente NETStandard.Library . Si desea eliminarlo, use PackageReference Remove="NETStandard.Library"/> .


No puede usar algunas bibliotecas en proyectos PCL porque no está construido como PCL y no es multiplataforma. Algunos espacios de nombres no están disponibles en los proyectos PCL y no están listados here .

Los siguientes ensamblajes están disponibles dentro de un proyecto de Portable Class Library:

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)

Sin embargo, no todos estos ensamblajes son compatibles con todas las plataformas.