我可以根据.NET框架版本制作预处理程序指令吗?

Dan*_*Tao 15 .net c# frameworks c-preprocessor preprocessor-directive

这是我想要做的具体例子.

考虑这个string.Join功能.在.NET 4.0之前,只有两个重载,两者都需要一个string[]参数.

从.NET 4.0开始,有一些新的重载采用了更灵活的参数类型,包括IEnumerable<string>.

我有一个库,其中包含一个Join基本上完成.NET 4.0 string.Join功能的功能.我只是想知道我是否可以使这个功能的实现依赖于目标.NET框架.如果是4.0,它可以简单地在string.Join内部调用.如果是3.5或更早,它可以调用自己的内部实现.

  1. 这个想法有意义吗?
  2. 如果它确实有意义,那么最合乎逻辑的方法是什么?我想我只是假设一个预处理器指令最有意义,因为当针对早于4.0的.NET版本时string.Join,使用IEnumerable<string>参数调用甚至不会编译 ; 所以无论我使用什么方法都必须在编译之前进行.(Environment.Version例如,在运行时检查属性不起作用.)

Jos*_*ers 15

您可以查看Stack Overflow上的另一个问题,该问题说明了如何通过项目文件的XML设置条件常量: 在编译时检测目标框架版本

然后使用它可以确定是否应该使用.NET 4重载或您自己的库.

  • 截至“现在”的最佳答案的快捷方式:/sf/answers/3419426251/ (2认同)

Aar*_*nke 7

在某个时候(不确定何时),Microsoft 将 .NET 版本的预定义符号添加到 MSBuild 构建系统中。如果您使用 .NET 5+ SDK 中的 MSBuild(即使您使用该 SDK 构建的项目使用的是更旧的目标框架),那么这里的所有内容都可以工作。

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives

目标框架 符号 .NET 5+ SDK 中提供了其他符号
.NET框架 网络框架、NET48、NET472、NET471、NET47、NET462、NET461、NET46、NET452、NET451、NET45、NET40、NET35、NET20 NET48_OR_GREATER、NET472_OR_GREATER、NET471_OR_GREATER、NET47_OR_GREATER、NET462_OR_GREATER、NET461_OR_GREATER、NET46_OR_GREATER、NET452_OR_GREATER、NET451_OR_GREATER、NET45_OR_GREATER、NET40_OR_GRE稍后、NET35_OR_GREATER、NET20_OR_GREATER
.NET标准 NETSTANDARD、NETSTANDARD2_1、NETSTANDARD2_0、NETSTANDARD1_6、NETSTANDARD1_5、NETSTANDARD1_4、NETSTANDARD1_3、NETSTANDARD1_2、NETSTANDARD1_1、NETSTANDARD1_0 NETSTANDARD2_1_OR_GREATER、NETSTANDARD2_0_OR_GREATER、NETSTANDARD1_6_OR_GREATER、NETSTANDARD1_5_OR_GREATER、NETSTANDARD1_4_OR_GREATER、NETSTANDARD1_3_OR_GREATER、NETSTANDARD1_2_OR_GREATER、NETSTANDARD1_1_OR_GREATER、NETSTANDARD ARD1_0_OR_GREATER
.NET 5+(和.NET Core) NET、NET6_0、NET5_0、NETCOREAPP、NETCOREAPP3_1、NETCOREAPP3_0、NETCOREAPP2_2、NETCOREAPP2_1、NETCOREAPP2_0、NETCOREAPP1_1、NETCOREAPP1_0 NET6​​_0_OR_GREATER、NET5_0_OR_GREATER、NETCOREAPP3_1_OR_GREATER、NETCOREAPP3_0_OR_GREATER、NETCOREAPP2_2_OR_GREATER、NETCOREAPP2_1_OR_GREATER、NETCOREAPP2_0_OR_GREATER、NETCOREAPP1_1_OR_GREATER、NETCOREAPP1_0_OR _更大

例如,这允许您执行以下操作:

#if NET5_0_OR_GREATER
    Console.WriteLine("This is .NET 5 or later.");
#elif NETCOREAPP
    Console.WriteLine("This is an older version of .NET Core.");
#elif NETFRAMEWORK
    Console.WriteLine("This is the legacy .NET Framework.");
#else
    Console.WriteLine("This is something else.");
#endif
Run Code Online (Sandbox Code Playgroud)