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或更早,它可以调用自己的内部实现.
string.Join,使用IEnumerable<string>参数调用甚至不会编译 ; 所以无论我使用什么方法都必须在编译之前进行.(Environment.Version例如,在运行时检查属性不起作用.)Jos*_*ers 15
您可以查看Stack Overflow上的另一个问题,该问题说明了如何通过项目文件的XML设置条件常量: 在编译时检测目标框架版本
然后使用它可以确定是否应该使用.NET 4重载或您自己的库.
在某个时候(不确定何时),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)