为啥没有设置 .NET 目标框架定义?

Posted

技术标签:

【中文标题】为啥没有设置 .NET 目标框架定义?【英文标题】:Why are .NET target framework defines not set?为什么没有设置 .NET 目标框架定义? 【发布时间】:2018-09-14 19:38:19 【问题描述】:

Target Frameworks documentation page 引用了某些定义是根据项目的目标框架自动设置的,我假设它会根据 Properties > Application 中的 Target framework 字段进行更改:

或者在创建新的 Visual C# 项目时选择目标框架(新项目 > Visual C# > 控制台应用程序 (.NET Framework))

但是据我测试,文档中指定的定义都没有真正定义。

例如,如果我创建一个.NET Framework 3.5 项目或在属性中手动将现有项目设置为目标.NET Framework 3.5,则NET35 未定义。

我已经采用了文档页面上列出的每一个定义,并添加了调试代码,如果有任何或全部已定义,则打印出来,但似乎没有定义: 源代码:https://gist.github.com/JohannesMP/ece8987fa18b2eaf830d7426c2256d6b


我是否对何时或如何设置这些定义做出了错误的假设?我还有什么其他可移植的方式来有条件地基于目标框架逐行编译代码?

我正在使用默认的 Microsoft .NET Framework 版本 4.7.03056 运行 Visual Studio Community 2017 版本 15.8.4

【问题讨论】:

有人已经提交了有关此问题的错误报告 (github.com/dotnet/docs/issues/7096)。这实际上是一个错误还是仅在某些/最近/新的构建系统中可用,我不知道...... 【参考方案1】:

没有。只有在您使用新的 SDK 项目格式并使用多个目标框架(例如net45netstandard1.3)时,此类预定义常量才有效。它们的存在是为了帮助你进行条件编译,从而支持多种框架。 My blog post 给出了一个具体的例子。

所以你应该创建一个使用新格式的新项目,而 .NET Framework Console Application 模板不是。

【讨论】:

【参考方案2】:

如果您从参考中删除,在控制台应用程序中不起作用,但在窗口应用程序中:Microsoft.CSharp 和 System.Net.http

【讨论】:

以上是关于为啥没有设置 .NET 目标框架定义?的主要内容,如果未能解决你的问题,请参考以下文章

更改项目目标框架后应用程序设置错误

为啥我需要将目标文件夹设置为源文件夹?第一次没有创建“目标”时项目是如何编译的?

ASP .NET Web 窗体 - 为啥父级不使用数据绑定表达式调用自定义控件的属性设置器?

为啥将我的目标框架从“.NET Framework 4 Client Profile”更改为“.NET Framework 4”会出现警告消息?

为啥 UIButton 框架设置这么慢

目标框架符号未定义