如何在Visual Studio 2017中从.NET Framework 4.5控制台应用程序引用.NET Standard库?

36
我已经成功安装了Visual Studio 2017.2,并尝试让我的第一个项目工作,但是遇到了一些问题,希望在这里得到解决。
我有一个非常简单的.NET标准库,其项目文件如下所述:
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard1.6</TargetFramework>
  </PropertyGroup>

</Project>

以下是一个非常简单的 .NET Framework 控制台应用程序,它引用上述 .NET Standard 库,并且项目文件描述如下:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net45</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\Common\Common.csproj" />
  </ItemGroup>

</Project>

当我构建控制台应用程序时,我遇到了以下的构建错误:

C:\Program Files\dotnet\sdk\1.0.4\NuGet.targets(97,5): error : Project Common is not compatible with net45 (.NETFramework,Version=v4.5). Project Common supports: netstandard1.6 (.NETStandard,Version=v1.6)

我看到了这个问题,并尝试了其中提供的一些建议,但是它们都没有起作用。所以,这似乎是一个不同的问题。请注意,这发生在我的解决方案的构建过程中,并且没有以任何方式引用(显式)NuGet包。

最后,如果有帮助的话,我有一个演示此问题的解决方案: https://github.com/Mike-EEE/Stash/blob/master/VS2017.Multi/VS2017.dotNetFramework.sln


6
你应该以.NET 4.6.1或更高版本为目标。 - Alois Kraus
1
我已经尝试了您的示例项目,似乎在使用VS 2017.2和.Net Standard引用时,项目引用还不能正常工作。请将库添加为普通文件引用,并将NETStandard.Library Nuget包添加到您的控制台应用程序中,然后它就可以正常工作了。 - Alois Kraus
3
是这样还是就是这样?这肯定看起来是一个非常明显和基本的场景,应该有可以演示这一点的工作代码。至少可以说令人惊讶的是找不到任何东西。添加直接文件引用可能对于某些配置(调试)有效,但其他配置(发布等)呢?这就是使用项目引用的好处。如果您能找到一个声明了这个问题是由于已知问题而导致的GitHub问题,并将其作为答案呈现出来,我会标记它。我所看到的一切都说这应该“只需按照描述工作”。 - Mike-E
你可以将$(Configuration)添加到引用路径中,例如Debug/Release构建,以获取一个与配置无关的csproj文件。但是,VS通常会在其上画波浪线,因为它无法正确识别它,尽管它确实有效。我同意.NET Core工具仍然很混乱,但随着每个版本的发布,它会变得更好。 - Alois Kraus
很高兴看到我不是唯一一个被这个新工具弄糊涂的人。:) 即使我已经多次阅读了兼容性矩阵,我仍然没有准确理解。请查看@martin-ullrich的被接受的答案。 - Mike-E
2个回答

40
.NET Framework 4.5仅支持使用.NET Standard 1.0或1.1的库。由于你的库的目标是1.6,因此工具会出错(因为你的库可能使用在.NET Framework 4.5中不可用的API)。如果你将库发布为NuGet包并通过包引用进行使用,则包还原也会出错(错误信息显示该包不兼容)。
有一些关于.NET Framework版本支持哪个.NET Standard版本的混淆,特别是因为有预览工具可用(“2.0”)可以更改这些版本。因此,文档中“.NET平台支持”表格包含两行有关支持版本的信息。然而,在你的情况下,两个版本都限制了.NET Framework 4.5只能使用.NET Standard 1.1。

好的!混乱确实是今天的关键词,马丁。感谢您的洞察力和解释。我的理解是该图表代表了允许的最大框架,而实际上它是确切允许的框架。我将通用项目设置为netstandard1.4,dotNet.Framework设置为net461,现在两个项目都可以按预期编译。再次感谢! - Mike-E
1
啊...由于我无法再编辑上面的评论,我想要确保澄清一下,net461 一直是我的目标,但是我的问题中使用了 net45,因为那是一个较低的框架,感觉会简化事情。但正如我们显然发现的那样,在这里没有什么是简单的。 ;) - Mike-E
1
是的,我看了你的 GitHub 存储库,它也是 net45,但我没有尝试构建它。如果您遇到其他问题,最好打开新的问题。 - Martin Ullrich
我知道这是一个老帖子,所以事情可能已经改变了。但是我创建了一个.NET Standard dll(2.0),并且能够在.net framework 4.5控制台应用程序中运行它。我只需要在控制台应用程序中引用netstandard.dll(以及我的自定义.NET标准dll)。 - benmartin101
如果您使用dll文件,只要它使用了不可用的API,任何事情都有可能发生。 - Martin Ullrich
2022年:如果有人在谷歌搜索,自2017年以来事情已经有所进展。虽然4.5与上面的答案一样,但.NET Framework 4.6.1 --> 4.8处于.NET Standard 2.0基线之下,可以利用.NET Standard 2.0库。 - user585968

9
为了使.NET Framework项目与.NET Standard库兼容,您必须从NuGet获取NETStandard.Library。
现在我找不到任何官方资源准确说明为什么这是必须的,但据我所知,NETStandard.Library具有必要的链接,可以从.NET Standard API转换为.NET Framework。
如果您需要更多信息,建议阅读NET Standard的官方文档。

1
我已经阅读了文档,特别是支持的框架版本矩阵,4.5版本肯定被支持。然而,没有提到如何使用工作和/或参考代码来实现这一点。如果有任何指针可以提供,将不胜感激。 - Mike-E
虽然这并没有回答问题,但我认为这一点非常有趣,而且很难找到相关信息。"要使.NET Framework项目与.NET Standard库兼容,您必须从NuGet获取NETStandard.Library。" - Jim Aho
这可能是过时的信息。为了使.NET Framework项目与.NET Standard库兼容,项目必须针对.NET Standard基线之一下的.NET Framework版本进行定位。请参见.NET Standard版本。换句话说,.NET Framework 4.5 --> 4.6.1。要查看每个版本如何映射到特定的.NET Standard基线,请访问提到的链接。 - user585968

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接