使用 nuget 包的目标框架注意事项?

Posted

技术标签:

【中文标题】使用 nuget 包的目标框架注意事项?【英文标题】:target framework considerations with nuget packages? 【发布时间】:2018-11-15 10:01:35 【问题描述】:

我对创建 NuGet 包的过程还很陌生。我最近通过 NuGetPackageExplorer 创建了一个 NuGet 包。 “Package Metadata”视图有一个“Framework Assembly References”部分,其值为“Microsoft.CSharp (Any,Verion=0.0)”。这是 nuspec 文件的样子:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <id>My.Cool.NuGet.Package</id>
    <version>1.0.2</version>
    <title></title>
    <authors>John Smith</authors>
    <owners>John Smith</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>My cool NuGet package</description>
    <frameworkAssemblies>
      <frameworkAssembly assemblyName="Microsoft.CSharp" />
    </frameworkAssemblies>
  </metadata>
</package>

您能否解释一下以下维度的关系、依赖关系和约束:

NuGet 包的源 .NET 项目的目标框架版本 nuspec 文件的frameworkAssemblies 部分 安装 NuGet 包的项目的目标框架版本

上面nuspec中的frameworkAssembly值在NuGetPackageExplorer中显示如下:

程序集名称:Microsoft.CSharp

支持的框架:Any,Version=v0.0

这是否意味着 NuGet 包旨在与 .NET 框架版本无关?有没有我想在本节中明确说明特定版本的情况?我问的原因是我昨天在一个 MVC 项目中安装了一个 NuGet 包,我遇到了一些奇怪的行为。具体来说:

NuGet 包显示为已安装并显示在引用列表中 我能够将 using 指令添加到 NuGet 包的命名空间

但是,当我尝试运行应用程序时,编译器针对这些 using 指令显示“找不到命名空间类型”的错误。但是随后编译器错误消失了,但应用程序不会运行先前编译器错误的 b/c。在我修改了 MVC 项目和 NuGet 包源项目的版本设置后,我能够绕过这个错误。所以现在我试图了解关于目标框架我需要考虑和配置的更详细的细节。

【问题讨论】:

【参考方案1】:

NuGet 包的源项目的 TargetFamework 应该是安装它的项目所需的最低框架版本。例如,如果您知道您将在 4.5 和 4.6 框架中拥有项目,则您可以为包 4.5 制作源代码。您还可以将多个框架的多个构建放在一个包中。这是关于那个的documentation。

安装包的项目的 TargetFramework 应该大于或等于包的版本。由于较高版本的框架与较低版本兼容。它不应允许您安装不支持您在项目中使用的框架的包。

frameworkAssemblies 部分仅定义包使用的框架组件,以便自动添加引用。查看documentation了解更多详细信息。

【讨论】:

以上是关于使用 nuget 包的目标框架注意事项?的主要内容,如果未能解决你的问题,请参考以下文章

如何调试 NuGet 包的 install.ps1 脚本

为什么在nuget.org上没有列出支持的包的框架?

如何检查我的 C# 应用程序是不是使用来自 nuget 包的正确平台特定 dll?

开发Modbus上位机程序

发布nuget包的正确姿势---cicd自动打包发布nuget包

发布nuget包的正确姿势-保姆级教程