如何将.NET Standard项目打包到nuget中,然后在安装时自动解决其依赖性?

问题描述

我有一个.NET Standard类库项目,该项目正在打包到nuget包中。它依赖于Newtonsoft.Json。

我通过在“程序包”选项卡下的项目属性上选中“在生成生成nuget程序包”来构建nuget程序包。

我也尝试做nuget pack。这是我的秘密:

<?xml version="1.0" encoding="utf-8"?>
<package >
  <Metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>$title$</title>
    <authors>$author$</authors>
    <owners>$author$</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <license type="expression">MIT</license>
    <projectUrl>http://project_url_here_or_delete_this_line/</projectUrl>
    <iconUrl>http://icon_url_here_or_delete_this_line/</iconUrl>
    <description>$description$</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>copyright 2020</copyright>
    <tags>Tag1 Tag2</tags>
    <dependencies>
      <dependency id="Newtonsoft.Json" version="12.0.3" />
    </dependencies>
  </Metadata>
</package>

然后我运行了此

nuget pack -Prop Configuration=Release -IncludeReferencedProjects

然后我有一个.NET Framework 4.8项目,我们向其中添加了.NET Standard nuget包。问题是我遇到以下错误

FileNotFoundException:无法加载文件或程序集“ Newtonsoft.Json,版本= 12.0.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed”或其依赖项之一。系统找不到指定的文件

我需要将nuget软件包管理器中的Newtonsoft.Json添加到.NET Framework项目中。当我安装.NET Standard nuget软件包时,没有安装它。

如何构建一个.NET Standard nuget软件包,该软件包将自动解决其依赖关系?

解决方法

nuget restore自动解决nuget软件包的依赖性。

我假定您在.NET Framework 4.8项目中引用了另一个版本的Newtonsoft.Json。

enter image description here

Newtonsoft.Json是一个强大的程序集。
对于强名称程序集,运行时在版本方面比较挑剔。

https://docs.microsoft.com/en-us/dotnet/standard/library-guidance/strong-naming

强命名的缺点是,一旦对程序集进行强命名,Windows上的.NET Framework就可以严格加载程序集。强名称的程序集引用必须与程序集引用的版本完全匹配,从而迫使开发人员在使用程序集时配置绑定重定向

您的.NET Framework 4.8项目希望使用强命名程序集无法使用的两个不同版本。
如果Newtonsoft.Json的名字不是很强,那就行得通。

添加@Perry Qian-MSFT评论中提到的绑定重定向应该可以解决您的问题。

这可以通过在VS Package Manager控制台中运行以下命令来完成
Get-Project -Name <ProjectName> | Add-BindingRedirect

您还可以在项目属性中启用自动生成绑定重定向: enter image description here