有谁知道如何确定你的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
类型的参数,默认有三个值: Windows
, Linux
和OSX
。 它可以使用如下:
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { // Do something }
该API是.NET标准2.0的一部分,因此可用于.NET Core 2.0和.NET Framework 4.7.1。