编辑:感谢@JohnSkeet 指出更简单的解决方案:
将您的网络标准库的 csproj 中的 TargetFramework 替换为 TargetFrameworks
<TargetFrameworks>net461;netstandard2.1</TargetFrameworks>
信息:Net461 是第一个支持 Net Standard 2.0 库的 netFramework 版本。
如果您需要 net framework 或 netcore 特定参考,您可以按照他指出的那样在您的 csproj 文件中使用 MS Build Actions
https://github.com/googleapis/gax-dotnet/blob/8c5682ad53f5d93716df5ab762c6ce4790edad72/Google.Api.Gax/Google.Api.Gax.csproj#L25
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
<Reference Include="System.Net.Http" />
</ItemGroup>
如果您死心塌地只想使用 Visual Studio UI 而不想使用自定义引用或 NuGetPackages 的文本编辑器修改 csproj,那么下面使用我的旧解决方案的唯一原因。
谢谢你,迈克尔
旧解决方案
您好,我想我找到了解决问题的方法:
- 创建一个名为 MyLibrary.Api 的共享项目
(同一个文件夹中的 .NET Standard 2.0 和 .NET Standard 2.1 项目之后的共享项目会导致错误 https://github.com/dotnet/sdk/issues/2720)
共享项目也应该有根命名空间的名称,因为共享项目不能有默认命名空间,所有新文件都以项目名称作为命名空间。
添加一个 .Net 标准类库 MyLibrary.Api.Core 并将其目标更改为 Net Standard 2.1(适用于 .NET Core 项目)
在 Add-Reference->Shared Projects 下引用 MyLibary.Api,现在在编译时,Shared Project 的所有文件都被编译到 MyLibrary.Api.Core 中。
添加一个 .Net 标准类库 MyLibrary.Api.NetFramework,将其保留在 Target Net Standard 2.0(这是用于 Net Framework 项目的
- 还添加对 MyLibrary.Api 共享项目的引用。
- 将最新版本的 Microsoft.Net.Compilers NuGet 包添加到 NetFramework 项目
用于测试:
- 添加一个 NetCore 控制台项目 MyLibrary.Console.Core 并引用 MyLibrary.Api.Core。
- 添加一个 netFramework 控制台项目 MyLibrary.Console.NetFramework 并引用 MyLibrary.Api.netFramework。将 .NET Framework 版本至少设置为 4.6.1,因为较低版本不支持 .Net Standard 2.0 项目。
现在激活 C# 8.0
现在在 .csproj 文件中的所有项目(MyLibrary.Api 共享项目除外)中添加到第一个 PropertyGroup LangVersion 和 Nullable(Nullable 不是必需的,如果您不添加它,它只会默认打开可空类型您需要添加启用#nullable的每个代码文件):
<PropertyGroup>
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
...
在 .NET Framework 项目中,我添加了一个带有 LangVersion 的新 PropertyGroup 部分,但我认为这不是必需的。
希望这对其他人也有帮助。
我的解决方案适用于希望在 .NET 核心项目中使用 NetStandard 2.1 优势但仍想在 .NET Framework 中使用库版本,甚至可以在 .NET Framework 中使用可为空类型的人。
同样这样你编译两个 dll。一个用于 NetFramework,一个用于 NetStandard 2.1 中的 .NET Core