6

是否可以在不使用 pinvoke 的情况下使用 .NET 重新启动 PC?

我只是重复了标题,但我不太确定如何进一步详细说明!

编辑:

我应该提到不想使用“shutdown -r”作为解决方案。

我真的很喜欢纯粹的.NET方式,比如:

Environment.ShutDown();

换句话说,随着新版本 Windows 的出现,使用 .NET 维护的东西。

编辑2:

不要再问“p/invoke 有什么问题”。这些答案正是 SO 用户似乎喜欢的;回答问题的所谓“横向”方法。然而,虽然 p/invoke 没有真正的问题,而且我很乐意使用它,但询问 .NET 是否有更正式的实现某事的方式到底有什么问题?如果它在 .NET 中,那么操作系统之间的任何 API 更改都会(很可能)得到反映。不管是什么原因,寻求最小化 DLL 导入使用不是犯罪吗?

我确定我是否在以下问题中包含了一些内容:

[DllImport("something32.dll")]
static extern int ClimbWall32Ex(IntPtr32 blah);

你可以这样做:

SomeNamespace.ClimbWall();

在座的每个人都会尖叫:“使用有什么问题SomeNamespace.ClimbWall();??”

叹。

4

3 回答 3

15

不知道为什么不只使用 P/Invoke,但另一种重新启动方式是System.Diagnostics.Process.Startshutdown命令结合使用。

例子:

System.Diagnostics.Process.Start("shutdown", "-r");


如果这也不可接受,您可以考虑使用WMI(请参阅此处的示例,该示例可能会根据您的目的进行修改)。

于 2009-10-14T13:04:34.513 回答
10

您可以使用 WMI 重新启动。以下是凭记忆,但我认为它非常接近,虽然有点草率。:)

var computer = "COMPUTERNAME";
var query = string.Format("SELECT * FROM Win32_OperatingSystem");

ManagementScope scope;

var computerPath = string.Format(@"\\{0}\root\cimv2", computer);

scope = new ManagementScope(computerPath);

scope.Connect();

var q = new ObjectQuery(query);
var s = new ManagementObjectSearcher(scope, q);

ManagementObjectCollection qr;

qr = s.Get();

foreach (ManagementObject r in qr) 
{
    string[] p = { "" };
    r.InvokeMethod("Reboot", p);
}
于 2009-10-14T13:26:07.683 回答
7

您需要调用仅通过 DllImport 可用的 ExitWindowsEx

于 2009-10-14T13:04:34.233 回答