我有一个PCL,我的目标是.NET 4.5.2和ASP.NET Core 1.0,但每当我从我的DotNetCore AspNetCore 1.0应用程序引用这个PCL时。
在安装2017.1 EAP 3之后,ReSharper成为一个问题,(从2016年开始)引用共享的.NET Standard 1.2项目工作得非常好!
通过将我的PCL的目标框架更改为.NET Framework 4.5
而不是.NET Framework 4.6
来管理以使其编译(不要问我它为什么有用,但肯定想知道为什么)。
现在正在成功编译,但我的IDE无法正确解析引用
我收到编译错误,说它不兼容。
答案 0 :(得分:1)
在屏幕截图中,您可以看到您的ASP.NET核心应用程序正在定位NETCoreApp1.0
。
在 NO CIRCUMSTANCES 下,您可以在.NET Core中使用.NET 4.5库。你必须要一个目标netstandard1.x
的库/包(在你的情况下是1.2,如果最小API是.NET 4.5.1或4.5.2)或者是针对兼容的PCL(即portable-net45+win8
或类似的)。
如果需要/必须使用不定位netstandard1.x
的.NET 4.5 / 4.6库,则必须从ASP更改NETCoreApp1.0
。 NET Core应用程序(不是PCL)项目设置为.NET Framework 4.5
。
我知道,但我必须针对Core 1.0未实现的.NET Standard 2.0。根据apisof.net,它在.Net Core 1.0中引用了System.Data.Common,但在2.0之前从未切入任何标准!
但是你不能在.NET Core上的Linux / MacOS上运行它。这限制了您在Windows上使用ASP.NET Core应用程序或在Linux / MacOS上使用Mono。
使用.NETStandard,您还可以同时定位net451
和netstandard1.x
,并使用预处理指令有条件地将代码编译到其中一个程序集中。
为此你需要创建一个新的"类库(.NET标准)"项目和编辑project.json(如果您使用的是VS2015)或csproj(VS2017)来添加目标。
project.json
"frameworks": {
"netstandard1.2": {
"imports": [
"dotnet5.6",
"portable-net45+win8"
],
"dependencies": {
"Some.NetCore.Only.Dependency": "1.2.3"
}
},
"net451": {
"dependencies": {
"Some.Net451.Only.Dependency": "1.2.3"
}
}
},
或csproj文件
<PropertyGroup>
<TargetFramework>netstandard1.2;net451</TargetFramework>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net451' ">
<!-- Framework references -->
<Reference Include="System.Runtime.Serialization" />
<!-- Framework references -->
<PackageReference Include="Some.Net451.Only.Dependency" Version="1.2.3" />
<!-- Projects within solution references -->
<ProjectReference Include="My.Domain.Core" Version="1.0.0" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.2' ">
<PackageReference Include="Some.NetCore.Only.Dependency" Version="1.2.3" />
</ItemGroup>
编译/打包时,它会创建两个二进制文件,一个用于netstandard1.2
,另一个用于net451
。
在代码中,使用众所周知的#if
指令(请参阅here以获取netstandard指令列表)
#if NETSTANDARD1_2
using Some.NetStandardOnly.Namespace;
#endif
using System;
#if NET451
public DataTable GetDataTable()
{
...
}
#endif