【问题标题】:When using nuget packages is there a way to avoid netstandard assemblies in favor of PCL?使用 nuget 包时,有没有办法避免使用 netstandard 程序集来支持 PCL?
【发布时间】:2018-09-06 00:06:52
【问题描述】:

我有一个桌面应用程序和一个针对 .Net 框架 4.6.2 的简单类库。最近我注意到,当我在 VS 2017 (15.6.3) 中更新我的 nuget 包时,其中一个开始引入一些更新的 netstandard2.0 程序集。

我渴望有一天能够构建网络标准库。但是现在我更喜欢将相应的 PCL(在同一个 nuget 包中可用)作为依赖项而不是 netstandard 程序集引入我的项目。我追求的nuget PCL程序集的目标是“portable-net45+win8+wp8+wpa81”。

我不想要 netstandard2.0 程序集的原因是因为它会导致一堆 shim 程序集出现在输出目录中,鉴于我的应用程序类库本身不针对 netstandard2.0,这有点过头了。发生的另一件事是 VS 开始为 System.ValueTuple 等不相关的包生成一堆版本冲突(编译器输出中的警告)。这似乎也与垫片相关(垫片可能来自路径 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\ net461\lib)

以下是我开始看到的版本冲突示例。

“Reference:System.ValueTuple, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL' 和 'Reference:System.ValueTuple' 之间发生冲突。选择“Reference:System.ValueTuple”,因为文件版本“4.6.26011.1”大于“4.6.25519.3”。

我希望这些只是警告,尽管非常可怕。我相信这些只是文件版本问题(与程序集版本无关),并且不认为它们会导致需要绑定重定向。即便如此,我会更高兴再次回到我的 PCL 并避免所有这些事情。我想一旦 .Net Framework 4.7.2 发布,我会更渴望使用和构建 netstandard 程序集。

我正在使用老式的 csproj 格式和用于 nuget 的 packages.config。似乎引入 netstandard2.0 位的 nuget 依赖项是 System.Composition。

System.Composition  1.1.0
System.Composition.AttributedModel  1.1.0
System.Composition.Convention   1.1.0
System.Composition.Hosting  1.1.0
System.Composition.Runtime  1.1.0
System.Composition.TypedParts   1.1.0
System.ValueTuple   4.4.0

希望这很清楚。我此时的解决方法是创建另一个面向 .Net 4.5 的类库,引入 System.Composition nuget 依赖项,运行 update-package,然后将包引用从 .Net 4.5 csproj 复制/粘贴到 .Net 4.6。 2 项目。然后我必须记住避免在那个 .Net 4.6.2 项目上更新我的包,否则它会覆盖我对 PCL 程序集的引用。

非常感谢任何帮助。我花了几个小时玩 nuget update 命令,但还没有找到避免 netstandard 的诀窍。我得到的最接近的是在 csproj 中使用“TargetFrameworks”而不是“TargetFrameworkVersion”,但也遇到了麻烦。

【问题讨论】:

  • 这里使用旧的 package.config 代替 PackageReference 可以将 csproj 文件中的路径设置为 pcl 版本。
  • @magicandre1981 - 是的,这基本上就是我上面描述的解决方法。我在 4.5 的项目中使用 nuget update-package;这构成了我最初真正想要的正确路径。然后我只是将结果从一个 csproj 复制到另一个。
  • 使用新的方式,您可以放松配置路径的选项。使用旧方法,直到包引用提供指定要加载的首选 DLL 的选项。
  • 我想你是在告诉我,即使是旧方法也需要手动编辑 csproj 中的“提示路径”。这些手动编辑必须在包含 nuget 参考后执行。这并不理想,因为当我以后运行 nuget 命令时,它将覆盖我对提示路径所做的所有手动编辑。我想要一个不那么脆弱的解决方案。但是,如果您认为手动编辑提示路径是将项目指向 PCL 程序集的唯一方法,那么我想我可以接受这个作为答案。
  • 我认为编辑是目前唯一的方法。试试看它是否有效。如果您使用源代码版本控制系统(SVN、Git、TFS),您可以详细跟踪每个更改。

标签: visual-studio-2017 package nuget printer-control-language .net-standard-2.0


【解决方案1】:

当使用 nuget 包时,有没有办法避免 netstandard 程序集而支持 PCL?

这是 .net 4.6.2 和 4.7.1 的 known issue,它需要一些这样的 system.* 程序集,因为当您将一些 nuget 包更新到最新版本时,4.7.1 中存在错误,其中一些可能会拉取较新的 netstandard2.0 程序集。

如果您不想添加这些 netstandard 程序集,您可以定位到 .net 4.7.1,但它仍然需要其中的 12 个,并且在 .net 4.7.2 上,bin 文件夹将只包含您的 dll 和 pdb。更详细的信息可以参考下面的帖子:

net462 referencing netstandard2.0 - can the large number of dlls be avoided?

实际上 4.7.1 还需要一些垫片才能加载 .netstandard2.0 程序集,但只需要 12 个并且带有 我们即将发布的工具只有这些 复制到 bin 文件夹。在 4.7.2 上,与 netstandard 的兼容性 将是收件箱,这意味着如果您将应用重定向到 4.7.2 (一旦可用)bin 文件夹将只包含您的 dll 和 pdb。

在 4.6.2 中,您仍然需要垫片,因为这就是您的方式 netstandard 库将能够绑定到桌面运行时。

.NET Standard issues on .NET Framework 4.7.1

希望这会有所帮助。

【讨论】:

  • netstandard 库在输出中引入了一堆垫片是一个已知问题。但是考虑到我实际上并不想要 netstandard 库,我如何完全避免它们而支持 PCL 程序集——这也可以吗?我不知道有什么方法可以告诉 nuget 避免使用 netstandard 程序集来支持 PCL。现在我不得不侵入我的 csproj 文件并更正从 nuget update-package 命令生成的路径。
  • 我用的是 4.7.2 但还是有同样的问题
【解决方案2】:

您应该能够使用PackageTargetFallback msbuild 属性来指定要使用的资产:

https://docs.microsoft.com/en-us/nuget/reference/msbuild-targets#packagetargetfallback

如果这对你不起作用,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多