让 .NET Framework 项目引用 .NET Standard 程序集需要什么?

Mas*_*ler 3 .net msbuild dependency-management .net-standard

我有一个针对 .NET Framework 4.6.2 构建的项目。它的依赖项之一是针对 .NET Standard 2.0 构建的程序集。

以前在我的旧计算机上构建得很好,但是现在我正在设置一个新的开发系统,当我尝试使用相同版本的相同工具运行构建时,出现了几十个错误关于 Netstandard DLL 引用了一堆在 .NET Core 中流行的小型单一命名空间程序集。例如:

无法解析主要引用“Foo”,因为它间接依赖于框架程序集“netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”,而在当前目标框架中无法解析。“.NETFramework,版本=v4.6.2”。要解决此问题,请删除引用“Foo”或将您的应用程序重定向到包含“netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”的框架版本。(MSB3268)

如果我从 GAC 明确添加对 Netstandard 2.0 的项目引用,则错误变为:

主要参考“netstandard”是一个框架程序集,在当前目标框架中无法解析。“.NETFramework,版本=v4.6.2”。要解决此问题,请删除引用“netstandard”或将您的应用程序重新定位到包含“netstandard”的框架版本。(MSB3267)

同样,这在旧系统上构建(并且仍然构建)没有错误,我正在尝试在完全相同的 IDE 和编译器上构建项目而不进行任何更改。所以我只能假设我缺少需要在我的开发系统上安装的东西,但我不太确定它是什么。

有没有人遇到过这个?我在这里发现了一些关于尝试从 C# .NET Framework 项目引用 Netstandard 程序集的其他问题,显然这很棘手,因为一些 Roslyn 相关的细节,但我实际上在我的 NET Framework 项目中使用了 Boo 语言,所以这些问题都不是特别相关,而且它以前确实工作得很好。

如果我只知道我忽略了哪些细节,这感觉应该有一个非常简单的答案......

jnm*_*nm2 6

由于试图将 .NET Standard 2.0 支持改装到 net461–net471 的工具链存在大量问题,.NET 团队一直强烈建议迁移到net472。如果升级是您的选择,它将节省大量时间。.NET Framework 4.7.2 还具有不需要在 bin 输出中存在数十个 shim DLL的附带好处,当然,任何 .NET Framework 升级都会带来一些小改进。(发行说明:net47net471net472。)

https://twitter.com/terrajobst/status/1031999730320986112

对不起,但我们搞砸了。我们试图让 .NET Framework 4.6.1 追溯实现 .NET Standard 2.0。这是一个错误,因为我们没有时间机器并且有一堆错误。如果您想从 .NET Framework 使用 .NET Standard 1.5+,我建议使用 4.7.2。

请注意,这与缺少 API 无关(尽管 .NET Framework 4.6.1 缺少大约 100 个 API)。这都是关于绑定策略、程序集标识和工具中框架程序集的处理(MSBuild、ClickOnce、测试运行程序等)。

这里学到的教训很简单:一旦发布,给定版本的 .NET 实现不得更改 .NET Standard 的支持级别。IOW,支持的 .NET Standard 编号是一个不可变的属性。支持更高版本需要发布新版本。