如何在运行时检查操作系统版本,例如windows或linux,而不使用条件编译语句

有谁知道如何确定你的C#代码运行在什么平台上,例如,它是否在Linux或Windows上运行,以便我可以在运行时执行不同的代码。

我有ac#windows应用程序,我想build立目标的Windows和Linux平台。

到目前为止,我已经创build了2个项目文件,指向同一组源代码文件。 然后我使用一个名为LINUX的项目之一的条件编译语句。

在实际代码中存在差异的地方,我使用条件编译语句使用编码语句,例如

#if (LINUX) ' do something #endif 

有没有更好的方法来做到这一点? 我真的不想要2个项目文件。

提前致谢。

您可以使用System.Environment.OSVersion.Platform检测执行平台:

 public static bool IsLinux { get { int p = (int) Environment.OSVersion.Platform; return (p == 4) || (p == 6) || (p == 128); } } 

从单声道常见问题解答 :

如何检测执行平台?

执行平台可以通过使用System.Environment.OSVersion.Platform值来检测。 但是,在任何情况下,正确检测Unix平台都需要多一点工作。 这个框架的第一个版本(1.0和1.1)没有包含任何Unix的PlatformID值,所以Mono使用的值是128.较新的框架2​​.0在PlatformID枚举中增加了Unix,不幸的是,有一个不同的值:4和更新.NET的版本区分Unix和MacOS X,为MacOS X引入了另一个值6。

这意味着为了正确检测在Unix平台上运行的代码,您必须检查三个值(4,6和128)。 这确保检测代码在Mono CLR 1.x运行时以及Mono和Microsoft CLR 2.x运行时上执行时都能按预期工作。

怎么样

 System.Environment.OSVersion 

您可以使用System.Environment.OSVersion来检查您在运行时所处的平台类型。

要扩展其他答案,在某个特性的linux和windows实现不兼容的情况下(即:需要引用仅对特定平台可用的库)时,还可以使用一个接口,并有两个独立的程序集,编译在每个平台上,用一个实现这个接口的类型。 然后,在检查的基础上,使用Assembly.Load()来加载只有正确的程序集(以及它的平台特定的依赖项),反射在程序集中找到你的类型,然后使用Activator.CreateInstance()来获得类型的一个实例你可以正常工作

我在微软的一个博客上找到了这个建议:

我们建议您使用RuntimeInformation.IsOSPlatform()进行平台检查。

参考: https : //blogs.msdn.microsoft.com/dotnet/2017/11/16/announcing-the-windows-compatibility-pack-for-net-core/

IsOSPlatform()接受一个OSPlatform类型的参数,默认有三个值: WindowsLinuxOSX 它可以使用如下:

 if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { // Do something } 

该API是.NET标准2.0的一部分,因此可用于.NET Core 2.0和.NET Framework 4.7.1。