C#8.0兼容非空类型的经典NetFramework(4.X)[重复]

问题描述 投票:1回答:1

我正在使用Blazor Asp.NET Core 3.1和所有很酷的新功能来启动一个新项目。但是对于与客户端的一个接口,我仍然需要一种支持WCF并因此支持Net Framework 4.8的解决方案。

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

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

问题3:一些更好的主意?

c# .net-4.0 non-nullable
1个回答
0
投票

编辑:感谢@JohnSkeet指出了一个更简单的解决方案:

用NetFrame标准库替换csproj中的TargetFramework和TargetFramework s

<TargetFrameworks>net461;netstandard2.1</TargetFrameworks>

信息:Net461是第一个支持Net Standard 2.0库的netFramework版本。

如果您需要net框架或netcore特定的引用,您可以像他指出的那样在csproj文件中使用MS Build Actionshttps://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,而不用带有文本编辑器的csproj来修改自定义引用或NuGetPackages,如果您已死定,则使用我的旧解决方案。

感谢Michael的问候

旧解决方案

您好,我想我找到了解决问题的方法:

  • 创建名为MyLibrary.Api]的共享项目>(由于.NET Standard 2.0和.NET Standard 2.1项目位于同一文件夹中,因此共享项目会导致错误https://github.com/dotnet/sdk/issues/2720
  • 共享项目也应具有根名称空间的名称,因为共享项目不能具有默认名称空间,并且所有新文件都将项目名称作为名称空间。

  • 添加.Net标准类库MyLibrary.Api.Core

  • ,并将其目标更改为(对于.NET Core项目)中的Net Standard 2.1。
  • Add-Reference-> Shared Projects下的Reference MyLibary.Api,现在在编译时,共享项目的所有文件都被编译成MyLibrary.Api.Core。

  • 添加.Net标准类库MyLibrary.Api.NetFramework

  • ,将其保留在目标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不是必需的,它默认情况下仅打开可为null的类型,如果不添加它,则为需要添加每个已启用#nullable):

的代码文件
  <PropertyGroup>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
    ...

在.NET Framework项目中,我用LangVersion添加了一个新的PropertyGroup部分,但我认为这不是必需的。

希望这对其他人也有帮助。

我的解决方案,那些想要为他们的.net核心项目使用NetStandard 2.1优势,但仍然希望在.NET Framework中使用该库的版本,甚至可以在.NET Framework中使用可空类型的人。

也通过这种方式,您可以编译两个dll。在NetStandard 2.1中,一个用于NetFramework,一个用于.NET Core。

© www.soinside.com 2019 - 2024. All rights reserved.