gpt4 book ai didi

.net - 如何打包针对.NET Core的可移植.NET库?

转载 作者:行者123 更新时间:2023-12-03 11:43:10 26 4
gpt4 key购买 nike

如何以现代通用方式打包可移植.NET库?假设我有一个AnyCPU程序集,希望对支持.NET Core API表面的任何.NET平台(例如.NET Framework 4.6和Universal Windows Platform)可用。

This is a series of questions and answers that document my findings on the topic of modern NuGet package authoring, focusing especially on the changes introduced with NuGet 3. You may also be interested in some related questions:

最佳答案

该答案基于principles used to package libraries targeting the .NET Framework。请先阅读链接的答案,以更好地理解以下内容。

要发布可移植的.NET库,您将需要创建具有以下结构的NuGet包:

\---lib
\---dotnet
MyPortableLibrary.dll
MyPortableLibrary.pdb
MyPortableLibrary.XML

所有这三个文件都将来自发布版本配置下项目的版本输出目录。

上面结构中的 dotnet目录具有特殊含义-它向NuGet指示该目录中的文件将在与您的程序包的所有依赖项都兼容的任何平台上使用。因此,您的软件包可以在支持所有依赖项的任何.NET平台(例如.NET Core)上自动使用。

至关重要的下一步是确定依赖项列表。由于 a package management issue,不可能简单地声明对.NET Core本身的依赖关系(.NET Core是所有.NET平台共享的API表面)。相反,您必须手动确定每个.NET Core组件依赖关系,并将其添加到nuspec文件。

.NET Core程序包的依赖项检测过程包括两个步骤:
  • 确定库引用的.NET Core程序集。
  • 确定包含这些程序集的NuGet程序包。

  • Visual Studio不提供您所需的信息。相反,您需要构建库并检查生成的DLL文件。以下PowerShell脚本将显示.NET程序集的引用:
    Get-ChildItem MyPortableLibrary.dll | % { [Reflection.Assembly]::LoadFile($_.FullName).GetReferencedAssemblies() | % { $_.Name + ".dll" } }

    该命令的输出将是程序集名称的列表,例如:
    System.Runtime.dll
    System.Resources.ResourceManager.dll
    System.Numerics.Vectors.dll

    获取列表后,在项目目录中打开project.lock.json文件。该文件包含有关项目使用的所有NuGet软件包的信息。除了其他数据外,您还会找到各种JSON块,例如:
    "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": {}
    }
    },

    此JSON块指示顶级值(System.Numerics.Vectors版本4.1.0)中列出的包提供了“compile”下列出的程序集文件。使用此信息可以将每个引用的程序集映射到NuGet程序包。请注意,尽管程序包和程序集名称通常相同,但并非总是如此!

    对于不属于.NET Core的任何NuGet软件包,您可以跳过上述过程,因为您已经知道依赖的确切软件包。仅由于由于上述问题而无法直接在.NET Core(Microsoft.NETCore程序包)上声明依赖项,才需要此处描述的依赖项检测逻辑。

    现在,根据以下示例,简单列出nuspec文件中的所有依赖项:
    <?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>

    而已!生成的程序包可在任何兼容的.NET平台(例如.NET Framework 4.6或通用Windows平台)上使用。在创建NuGet软件包之前,请记住使用Release配置来构建您的解决方案。

    示例库和相关的打包文件是 available on GitHub。与此答案对应的解决方案是PortableLibrary。

    请参阅 Lucian Wischik's blog,以更深入地了解对此类NuGet软件包进行操作的逻辑。

    关于.net - 如何打包针对.NET Core的可移植.NET库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34611919/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com