未定义目标框架符号

Rei*_*ica 3 c# preprocessor-directive

我正在尝试使用 if 编译器指令有条件地包含 .Net Framework 早期版本所需的一些代码,但不是更高版本。

我使用了 MSDN 中的以下参考资料、#if 编译器指令参考资料和目标框架参考资料。

我正在编写一个 .Net 4.5.1 应用程序,但似乎没有定义 NET451 符号,其他任何符号也没有定义。

我已经改编了 Target Frameworks MSDN 文章中的示例以包含所有框架符号,因此我可以看到定义了哪个。

#if NET20
        Console.WriteLine("Target framework: NET20");
#elif NET35
        Console.WriteLine("Target framework: NET35");
#elif NET40
        Console.WriteLine("Target framework: NET40");
#elif NET45
        Console.WriteLine("Target framework: NET45");
#elif NET451
        Console.WriteLine("Target framework: NET451");
#elif NET452
        Console.WriteLine("Target framework: NET452");
#elif NET46
        Console.WriteLine("Target framework: NET46");
#elif NET461
        Console.WriteLine("Target framework: NET461");
#elif NET462
        Console.WriteLine("Target framework: NET462");
#elif NET47
        Console.WriteLine("Target framework: NET47");
#elif NET471
        Console.WriteLine("Target framework: NET471");
#elif NET472
        Console.WriteLine("Target framework: NET472");
#elif NETSTANDARD1_0
        Console.WriteLine("Target framework: NETSTANDARD1_0");
#elif NETSTANDARD1_1
        Console.WriteLine("Target framework: NETSTANDARD1_1");
#elif NETSTANDARD1_2
        Console.WriteLine("Target framework: NETSTANDARD1_2");
#elif NETSTANDARD1_3
        Console.WriteLine("Target framework: NETSTANDARD1_3");
#elif NETSTANDARD1_4
        Console.WriteLine("Target framework: NETSTANDARD1_4");
#elif NETSTANDARD1_5
        Console.WriteLine("Target framework: NETSTANDARD1_5");
#elif NETSTANDARD1_6
        Console.WriteLine("Target framework: NETSTANDARD1_6");
#elif NETSTANDARD2_0
        Console.WriteLine("Target framework: NETSTANDARD2_0");
#elif NETCOREAPP1_0
        Console.WriteLine("Target framework: NETCOREAPP1_0");
#elif NETCOREAPP1_1
        Console.WriteLine("Target framework: NETCOREAPP1_1");
#elif NETCOREAPP2_0
        Console.WriteLine("Target framework: NETCOREAPP2_0");
#elif NETCOREAPP2_1
        Console.WriteLine("Target framework: NETCOREAPP2_1");
#elif NETCOREAPP2_2
        Console.WriteLine("Target framework: NETCOREAPP2_2");
#else
        Console.WriteLine("Could not tell which framework we're using.");
#endif
Run Code Online (Sandbox Code Playgroud)

结果输出是“无法判断我们正在使用哪个框架”。

难道我做错了什么?文档不正确吗?还是我发现了一个错误?

Cod*_*ter 5

这些指令仅由 .NET Core 的构建系统隐式生成。文档中的关键字:

.NET Core 目标框架的预处理器符号的完整列表是:

因此,当您创建面向 .NET Framework 的新应用程序或类库时,这些指令将丢失。而是创建 Core 或 .NET Standard 库或应用程序。

如果您还没有准备好迁移到 Core,请参阅在编译时检测目标框架版本以获取解决方法 - 例如,您可以自己定义它们。

  • @dlf,您可以让符号与 .Net Framework 项目一起使用,但您必须使用新的 .NetStandard 项目格式,并以您首选的 .NetFramework 版本为目标。他们甚至在文档页面上有一个示例。 (2认同)