usar - ¿Cómo empaquetar una biblioteca.NET portátil dirigida a.NET Core?
crear una clase en visual studio 2017 (2)
Esta respuesta se basa en los principios utilizados para empaquetar bibliotecas dirigidas a .NET Framework . Lea la respuesta vinculada primero para comprender mejor lo siguiente.
Para publicar la biblioteca .NET portátil, deberá crear un paquete NuGet con la siguiente estructura:
/---lib
/---dotnet
MyPortableLibrary.dll
MyPortableLibrary.pdb
MyPortableLibrary.XML
Los tres archivos provendrán del directorio de salida de compilación de su proyecto en la configuración de compilación de lanzamiento.
El directorio dotnet
en la estructura anterior tiene un significado especial: le indica a NuGet que los archivos en el directorio deben usarse en cualquier plataforma con la que todas las dependencias de su paquete sean compatibles. Por lo tanto, su paquete se puede utilizar automáticamente en cualquier plataforma .NET que admita todas sus dependencias (por ejemplo, .NET Core).
El siguiente paso crucial es determinar la lista de dependencias. Debido a un problema de administración de paquetes, no es posible declarar simplemente una dependencia en el propio Core .NET (.NET Core es la superficie API compartida por todas las plataformas .NET). En su lugar, debe determinar manualmente cada dependencia del componente .NET Core y agregarla al archivo nuspec.
El proceso de detección de dependencias para paquetes de .NET Core consta de dos pasos:
- Determine los ensamblados de .NET Core a los que hace referencia su biblioteca.
- Determine los paquetes de NuGet que contienen estos ensamblajes.
Visual Studio no proporciona la información que necesita. En su lugar, necesita construir su biblioteca e inspeccionar el archivo DLL resultante. La siguiente secuencia de comandos de PowerShell mostrará las referencias de un ensamblado .NET:
Get-ChildItem MyPortableLibrary.dll | % { [Reflection.Assembly]::LoadFile($_.FullName).GetReferencedAssemblies() | % { $_.Name + ".dll" } }
La salida de este comando será una lista de nombres de ensamblajes, por ejemplo:
System.Runtime.dll
System.Resources.ResourceManager.dll
System.Numerics.Vectors.dll
Una vez que haya obtenido la lista, abra el archivo project.lock.json en el directorio de su proyecto. Este archivo contiene información sobre todos los paquetes de NuGet utilizados por su proyecto. Encontrará, entre otros datos, varios bloques de JSON como los siguientes:
"System.Numerics.Vectors/4.1.0": {
"dependencies": {
"System.Globalization": "[4.0.10, )",
"System.Resources.ResourceManager": "[4.0.0, )",
"System.Runtime": "[4.0.20, )",
"System.Runtime.Extensions": "[4.0.10, )"
},
"frameworkAssemblies": [
"mscorlib",
"System.Numerics"
],
"compile": {
"ref/net46/System.Numerics.Vectors.dll": {}
},
"runtime": {
"lib/net46/System.Numerics.Vectors.dll": {}
}
},
Este bloque de JSON indica que los archivos de ensamblaje enumerados en "compilar" son proporcionados por el paquete listado en el valor de nivel superior (System.Numerics.Vectors versión 4.1.0). Utilice esta información para asignar cada conjunto referenciado a un paquete de NuGet. Tenga en cuenta que si bien los nombres de paquetes y conjuntos son a menudo los mismos, ¡no siempre es así!
Para cualquier paquete NuGet que no forme parte de .NET Core, puede omitir el proceso anterior ya que ya sabe el paquete exacto del que depende. La lógica de detección de dependencia que se describe aquí solo es necesaria porque no puede declarar una dependencia directamente en .NET Core (el paquete Microsoft.NETCore) debido al problema vinculado anteriormente.
Ahora simplemente haga una lista de todas las dependencias en su archivo nuspec, basándose en el siguiente ejemplo:
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata minClientVersion="3.2">
<id>Example.MyPortableLibrary</id>
<version>1.0.0</version>
<authors>Firstname Lastname</authors>
<description>Example of a portable library with NuGet package dependencies.</description>
<dependencies>
<dependency id="System.Numerics.Vectors" version="4.1.0" />
<dependency id="System.Resources.ResourceManager" version="4.0.0" />
<dependency id="System.Runtime" version="4.0.20" />
</dependencies>
</metadata>
<files>
<file src="../bin/Release/MyPortableLibrary.*" target="lib/dotnet" />
</files>
</package>
¡Eso es! El paquete resultante se puede utilizar en cualquier plataforma .NET compatible, como .NET Framework 4.6 o Universal Windows Platform. Recuerde construir su solución utilizando la configuración de la versión antes de crear el paquete NuGet.
Una biblioteca de muestra y los archivos de empaquetado relevantes están disponibles en GitHub . La solución correspondiente a esta respuesta es PortableLibrary.
Consulte el blog de Lucian Wischik para conocer más a fondo la lógica que opera en dichos paquetes de NuGet.
¿Cómo empaquetar una biblioteca .NET portátil de una manera moderna y de propósito general? Supongamos que tengo un único ensamblaje AnyCPU que deseo poner a disposición de cualquier plataforma .NET que admita la superficie de API .NET Core, por ejemplo .NET Framework 4.6 y Universal Windows Platform.
Esta es una serie de preguntas y respuestas que documentan mis hallazgos sobre el tema de la creación moderna de paquetes NuGet, centrándose especialmente en los cambios introducidos con NuGet 3. También puede interesarle algunas preguntas relacionadas:
- ¿Cómo empaquetar una biblioteca de .NET Framework?
- ¿Cómo empaquetar una biblioteca .NET dirigida a la plataforma universal de Windows?
- ¿Cómo empaquetar una biblioteca .NET dirigida a .NET Framework y la plataforma universal de Windows e incluir funcionalidades específicas de la plataforma?
- ¿Cómo empaquetar una biblioteca .NET de arquitectura múltiple que apunte a la plataforma universal de Windows?
- ¿Cómo empaquetar una biblioteca .NET dirigida a la plataforma universal de Windows y depende de los SDK de extensión de Visual Studio?
Parece que ha habido mucha confusión sobre la mejor manera de crear bibliotecas portátiles de .NET / paquetes NuGet en los últimos meses. Si puede esperar un poco, querrá leer sobre el estándar .NET . Immo Landwerth escribió una entrada de blog detallada al presentar .NET Standard en septiembre de 2016. Se espera que el soporte para .NET Standard 2.0 en .NET Core llegue a principios de 2017 , en el mismo período de tiempo que Visual Studio 2017, que actualmente se encuentra en Release Candidate escenario. .NET Standard 2.0 será implementado por .NET Framework, .NET Core y Xamarin. También incluirá shims de compatibilidad para los binarios de .NET Framework, lo que debería facilitar la adopción.
Actualizar:
Oren Novotny tiene una publicación de blog muy informativa sobre este tema: Multi-targeting the world: un proyecto único para gobernarlos a todos . Discute .NET Standard y cómo realizar múltiples objetivos con Visual Studio 2017. La publicación del blog era anterior al RTM de Visual Studio 2017, pero es muy útil.