【问题标题】:How to use OS-specific procedures on .NET Core 2 program?如何在 .NET Core 2 程序上使用特定于操作系统的程序?
【发布时间】:2020-03-07 01:23:29
【问题描述】:

我对使用 .NET Core 2.x 用 C# 编写多平台程序非常感兴趣。我已经进入了一个使用System.Diagnostics.Process 监控和控制流程的实验。

也就是说,我相信我已经在处理一个关键用例,因为它可能很容易要求 .NET Core 仍然无法向开发人员公开的特定于系统的过程.没有任何实际案例,这仍然是一个问题,但我正在考虑以下任务:

  • 获取物理+逻辑处理器的数量(在 Windows 上,one should use WMI,我认为 .NET Core 无法在 MacOS/Linux 上做同样的事情)。
  • 创建崩溃进程的内存转储(可能需要特定于操作系统的调用?)
  • 一般来说,通常是通过特定操作系统的原生 C++ 调用来完成的任何事情

所以我想知道如何处理这些“未来”问题。 .NET Core / C# 仍然是满足我需求的有效解决方案吗?或者有没有办法在 .NET Core 2.x 项目上调用特定于操作系统的调用?

注意:由于外部原因,我目前仅限使用 .NET Core 2.x 分支,而不是 3.x。

【问题讨论】:

  • 使用c#的原因是通过使用托管功能添加的保护以防止计算机进入蓝屏。因此托管代码在访问内存的方式上受到限制。 C++ 允许更多地访问内存。解决您的问题的最佳方法是编写 c++ 包装器(自定义 dll)来执行您无法从核心访问的方法,然后让您的 c# 方法调用 c++ 包装器。
  • 谢谢,P/Invoke 是从 .NET Core 执行此操作的正确方法吗?
  • pinvoke 是 Windows dll,是独立于操作系统的标准接口。因此,每个版本的 Windows 将具有相同的 dll 名称,但代码根据 Windows 的版本而有所不同。因此,如果您的代码要在不同的操作系统上运行,则使用 pinvoke 将起作用。大多数情况下,网络库只是调用 Windows dll 的包装器。所以如果 CORE 不提供使用 pinvoke 的方法是一个很好的方法。

标签: c# linux windows .net-core


【解决方案1】:

除非您不打算使用任何 MS GUI 框架(Windows Forms、WPF、UWP),否则 .NET Core 也可以在 Windows 以外的平台上成为灵活可行的选择。

可以使用p/invoke 来访问本机方法,这应该与.NET Core running on Unix-like systems too 一起使用,尽管每个操作系统上只有系统特定的库可用。

RuntimeInformation.IsOSPlatform 方法和conditional compilation symbols 也可用于为特定操作系统分支代码。

其他人已经有关于如何从 .NET Core 应用程序获取转储的answer

【讨论】:

  • 非常感谢。作为记录,我也在寻找 GUI 框架,我发现 Avalonia 非常有前途。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2016-12-11
相关资源
最近更新 更多