首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >兼容传统NetFramework (4.X)的C# 8.0非可空类型

兼容传统NetFramework (4.X)的C# 8.0非可空类型
EN

Stack Overflow用户
提问于 2019-11-29 17:33:56
回答 1查看 325关注 0票数 2

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

因此,如果我将我的api项目(目前为止是net标准2.0)设置为net标准2.1,我会得到错误: Net Framework不支持netstandard 2.1。

问题1:有没有办法在net framework中仍然支持可以为空的类型?问题2:如果不是这样的话:除了我的新的net标准2.1项目之外,我是否可以创建第二个net标准2.0项目,它仍然支持旧的net framework,并将不可为空的类型编译为可以由Net Framework加载的程序集?然后,我可以为我的WCF服务使用非net all all netcore项目和net Standard 2.0版本。

问题3:有更好的想法吗?

EN

回答 1

Stack Overflow用户

发布于 2019-11-29 20:56:00

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

用TargetFrameworks替换Net标准库的csproj中的TargetFramework

代码语言:javascript
运行
复制
<TargetFrameworks>net461;netstandard2.1</TargetFrameworks>

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

如果您需要特定于net framework或netcore的引用,您可以在您的csproj文件https://github.com/googleapis/gax-dotnet/blob/8c5682ad53f5d93716df5ab762c6ce4790edad72/Google.Api.Gax/Google.Api.Gax.csproj#L25中使用MS Build操作

代码语言:javascript
运行
复制
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System.Net.Http" />
</ItemGroup>

下面使用我的旧解决方案的唯一原因是,如果您确定只想使用Visual Studio UI,而不是使用自定义引用或NuGetPackages的文本编辑器修改csproj。

感谢问候迈克尔

旧解决方案

你好,我想我找到了我的问题的解决方案:

创建名为MyLibrary.Api的共享项目(由于同一文件夹中的.NET标准2.0和.NET标准2.1项目导致错误,因此共享项目应具有根命名空间的名称,由于共享项目不能具有默认命名空间,并且所有新文件都会将项目的名称作为namespace.

  • Add a MyLibrary.Api.Core标准类库,并在中将其目标更改为Net Standard 2.1 (对于Add-Reference->Shared Projects下的.NET .Net MyLibary.Api,现在可以通过compiliation将共享项目的所有文件编译成.Net标准类库MyLibrary.Api.NetFramework,将其保留为目标Net标准2.0 (这适用于Net框架项目添加对MyLibrary.Api共享项目的引用。

  • 将最新版本的Microsoft.Net.Compilers NuGet包添加到NetFramework Projects

  • Also

用于测试的

添加和参考MyLibrary.Api.Core.

  • Add a NetCore Console项目MyLibrary.Console.Core

  • NetCore Console项目MyLibrary.Console.Core和参考MyLibrary.Api.netFramework。将.NET框架版本至少设置为4.6.1,因为较低版本不支持.Net标准2.0项目。

现在激活C# 8.0

现在,在.csproj文件中的所有项目(除了MyLibrary.Api共享项目)中,添加到第一个PropertyGroup LangVersion和Nullable (Nullable不是必须的,默认情况下它只是打开了nullable类型,如果您不添加它,您需要在每个代码文件中添加#nullable启用):

代码语言:javascript
运行
复制
  <PropertyGroup>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
    ...

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

希望这也能帮助到其他人。

我的解决方案适用于那些想要在.net核心项目中使用NetStandard 2.1的优点,但仍然想要在.NET框架中使用某个版本的库,甚至可以在.NET框架中使用可空类型的人。

同样,通过这种方式,您可以编译两个dll。一个用于NetFramework,另一个用于NetStandard 2.1中的.NET核心

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59102179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档