如果之前有人询问,请先抱歉。我搜索并搜索了netstandard2.0已经发布时存在很多冲突和过时的信息。
我正在学习新的netstandard和核心迁移,并使用CLI dotnet命令构建了空的vanilla“hello world”项目。 有Nuget参考。
问题是从netstandard2.0 classlib添加引用到net461 classlib会导致错误 (netstandard2.0 - > net461参考)
"cannot be added due to incompatible targeted frameworks between the two projects. Please review the project you are trying to add and verify that is compatible with the following targets"
Rich Lander的这篇微软文章声称我可以用netstandard2.0
来做到这一点此外,Immo Landwerth [MSFT]在他的文章中似乎通过兼容性垫片提出了可能性,我认为可能仅由Nuget参考:
https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/
(也许Scott Hanselman可以提供帮助!)
看来netsandard2.0支持net461,“.NET实现支持”网格显示了这一点。
https://docs.microsoft.com/en-us/dotnet/standard/net-standard
创建了一个GitHub仓库以演示此
https://github.com/raxuser100/net_standard_references.git https://github.com/raxuser100/net_standard_references/tree/master
在上面克隆master并从命令提示符运行:
dotnet add .\classlib_netstandard2.0_ref_classLib_net461\classlib_netstandard2.0_ref_classLib_net461.csproj reference .\classlib_net461\classlib_net461.csproj
然后您将收到错误。
csproj文件具有以下内容 classlib_net461.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net461</TargetFramework>
</PropertyGroup>
</Project>
classlib_netstandard2.0.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
我使用下面的CLI命令创建项目结构:
dotnet new console --name console_core2.0 --framework netcoreapp2.0
dotnet new classlib --name classlib_netstandard2.0 --framework netstandard2.0
dotnet new classlib --name classlib_net461 --target-framework-override net461
# netstandard2.0 --> net461 link
dotnet new classlib --name classlib_netstandard2.0_ref_classLib_net461 --framework netstandard2.0
<#
add project a reference
netstandard2.0 --> net461 link
this returns an error
cannot be added due to
incompatible targeted frameworks between the two projects. Please review the project you are trying to add and verify that is compatible with the following targets:
At line:1 char:1
Works if we edit classlib_net461.csproj and add multiple targets including netstandard2.0
<PropertyGroup>
<TargetFrameworks>net461;netstandard2.0</TargetFrameworks>
</PropertyGroup>
#>
dotnet add .\classlib_netstandard2.0_ref_classLib_net461\classlib_netstandard2.0_ref_classLib_net461.csproj reference .\classlib_net461\classlib_net461.csproj
如果我们编辑classlib_net461.csproj并添加多个目标,包括netstandard2.0
,则有效classlib_net461.csproj
<PropertyGroup>
<TargetFrameworks>net461;netstandard2.0</TargetFrameworks>
</PropertyGroup>
现在,当我们参考时,它可以正常工作,如下所示:
classlib_netstandard2.0_ref_classLib_net461.csproj
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<ProjectReference Include="..\classlib_net461\classlib_net461.csproj" />
</ItemGroup>
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
这是否有效,因为现在两个classlib都以netstandard2.0为目标
是否有一个简单的图表可以用简单的术语揭开所有这一切的神秘面纱!
为什么这不起作用。如果一个空的netstandard2.0实现了net461的大部分,那么它肯定拥有支持裸网络461引用所需的一切。我知道有一些api是行不通的,即WPF,但是这些是裸项目,没有Nuget或直接二进制引用。
解决方法,为什么这样做?我们是否总是需要在classlib中同时定位net461和netstandard2.0,以便netstandard2.0只能引用classlib来引用它们。
在netstandard2.0 classlib中使用旧的.net框架类库(net4.3以上)的正确结构是什么。
这是如何运作的?
答案 0 :(得分:0)
支持.NET Standard 2.0+和.NET Core 2.0+项目以引用.NET Framework库目前仅限于NuGet包(通过特殊的回退定义),这就是为什么它不适合您的项目到 - 项目参考。
当MSBuild为此使用相同的解决方案策略时,这可能会在即将推出的工具版本中发生变化。请参阅this tracking GitHub issue。