【问题标题】:C# 8.0 Non Nullable Types compatible Classic NetFramework (4.X) [duplicate]C# 8.0 Non Nullable Types compatible Classic NetFramework (4.X) [重复]
【发布时间】:2019-11-29 09:33:55
【问题描述】:

我正在使用 Blazor Asp.NET Core 3.1 和所有酷炫的新奇花哨的东西开始一个新项目。但是对于客户端的一个接口,我仍然需要一个支持 WCF 从而支持 net framework 4.8 的解决方案。

因此,如果我将我的 api 项目(目前为 net standard 2.0)设置为 net standard 2.1,则会收到错误 Net Framework 不支持 netstandard 2.1。

问题 1:有没有办法在 net framework 中仍然支持可空类型? (或者一种在网络核心中支持 wcf 的可行方法 - 我需要 wcf,因为我需要一个库,我需要托管一个) 问题 2:如果不是:除了我的新 net standard 2.1 项目之外,我是否可以创建第二个 net standard 2.0 项目,它仍然支持旧的 Net Framework 并将不可为空的类型编译为可由 net framework 加载的程序集?然后我可以为我的 WCF 服务使用 Non-Nullable Libary 所有 netcore 项目和 net Standard 2.0 版本。

问题 3:一些更好的想法?

【问题讨论】:

  • 我认为您可以在.Net Framework 项目的csproj 文件中添加一个 标记并将其设置为“8.0”。要启用可空类型,您还必须添加 标记并将其设置为“启用”。不过,这仅在您使用 Visual Studio 2019(不确定哪个专用版本)并且您将无法使用 C# 8 的全部更改时才有效。(例如,默认接口实现将不起作用)。
  • 感谢 GSerg,事先没有找到帖子。我的解决方案有点不同,所以我在下面发布了答案

标签: c# .net-4.0 non-nullable


【解决方案1】:

编辑:感谢@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

【讨论】:

  • 看起来你做的比你需要的要复杂得多。您可以使用 &lt;TargetFrameworks&gt;net40;netstandard2.1&lt;/TargetFrameworks&gt; 创建单个类库,将 LangVersion 设置为 8.0 并启用可为空的引用类型。
  • 但是当我只做一个项目时,我不能分别添加对 NetStandard 2.0 和 2.1 项目的单独引用吗?例如,仅针对 Net Standard 2.0 项目对 Microsoft.Net.Compilers 的引用?
  • 您可以在 MSBuild 文件中使用条件 - 例如,请参阅 github.com/googleapis/gax-dotnet/blob/…
  • 谢谢。所以要么是两个 2 类项目和一个共享项目,要么我在 .csproj 文件中使用 MSBuild。我即将迁移我的大项目,其中还出现以下错误:Package Microsoft.EntityFrameworkCore 3.0.0-preview5.19227.1 与 net40 (.NETFramework,Version=v4.0) 不兼容。在那里,我首先遵循了目标框架方法,可以决定是使用 MSBuild 还是 3 Projects。
  • 您已经在使用 MSBuild。 csproj 文件 MSBuild 文件。这不像我在项目文件中建议任何不寻常的东西 - 只是在参考中添加一个条件。不需要额外的库或类似的东西。
猜你喜欢
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
相关资源
最近更新 更多