【发布时间】: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