NET核心-跨平台代码


。NET核心是跨平台的,在这篇简短的文章中,我将描述一种在运行时检测底层操作系统的简单方法。

有些情况下,我们希望基于操作系统运行一段不同的代码。这种功能在各种场景中都很有用,例如,我想要获取底层硬件信息,以便将其绑定到许可机制。虽然。NET Core确实已经支持各种各样的操作,但在这个特定的用例中,并不支持跨平台获取这些信息。

因此,我采取的路线是简单的本质上,不需要复杂的编程和工作完成。我将描述这个想法,并根据您的用例和对代码清洁性的需求自由地重构它。

我知道,在windows方面,system.management命名空间提供了对有关windows management Instrumentation(WMI)基础结构所检测的系统,设备和应用程序的一组丰富的管理信息和管理事件的访问。你可以在https://docs.microsoft.com/en-us/dotnet/api/system.management?view=netframework-4.8

但是,如果您想在Linux中使用System.Management命名空间,它将不起作用。已经有一个GitHub线程将此功能引入。NET core,您可以继续了解它https://github.com/dotnet/corefx/issues/22660

我们如何在不复杂的情况下实现这一功能?我使用的方法是使用现有的System.Management命名空间和它提供的功能来获取事物的windows端的硬件信息。对于Linux,我们可以使用bash命令来获得相同的结果。因此,我们希望从。NET核心应用程序执行bash命令,而且单独来说,这种功能是非常强大的。

让我们在高级任务中对此进行分解:

  • 从。NET核心应用程序中识别操作系统
  • 基于操作系统执行相关命令(。NET或Linux)并获得结果

识别操作系统

。NET核心控制台应用程序


Windows操作系统上应用程序的输出


为了在Linux上测试这段代码,由于使用简单,我使用了Docker Linux-Ubuntu和Linux-armv7 debian映像,但如果您手动将发布的应用程序部署到这些OS上,结果应该是一样的。

下面是在Linux上运行相同应用程序的屏幕截图。为了简单起见,Docker和如何发布。NET核心应用程序的讨论不在本文的讨论范围之内。

在Linux容器上运行的应用程序

正在获取硬件信息

不管本节的标题如何,本部分还将演示如何通过。NET Core在Linux上执行bash命令。下面是上一个示例中稍作修改的代码。注我省略了用于MAC的部分,因为概念是相同的,您可以按照相同的模式实现它。

修改代码以执行特定于平台的功能


一般来说,修改后的程序又是简单的;我们将特定于平台的功能包装在单独的类中,然后简单地在相应的块中使用这些功能。下面是在Windows和Linux上执行时的输出。(注意,我从两个平台读取的数据略有不同,也可以是任何数据)。

在Windows上


关于Docker Linux映像


构图本身很简单;您可以基于平台执行任何您想执行的逻辑。检查相应代码CPUInformationChecker(windows和Linux部分)下面的内容

用于获取CPU信息的Windows特定代码


Linux bash命令


封装bash执行功能的扩展方法


因此,这是在某些情况下执行特定于平台的代码的一种非常简单的方法。上面提到的技巧还可以进行更多的优化,如果你想的话,你也可以使用条件编译标志。

如果有不清楚的地方可以在评论中提出来。快乐的编码!