是否可以在不使用pinvoke的情况下使用.NET重新启动PC?
我只是重复了标题,但我不太清楚如何进一步阐述!
修改
我应该提到不要使用“shutdown -r”作为解决方案。
我真的采用纯粹的.NET方式,例如:
Environment.ShutDown();
换句话说,随着Windows的新版本而出现的东西出现了。
编辑2:
请停止询问“p / invoke有什么问题”。这些答案正是SO用户似乎喜欢的;回答问题的假设“横向”方法。然而,尽管p / invoke没有真正的问题,我很乐意使用它,但是问.NET是否有更正式的实现方法呢?如果它在.NET中,那么操作系统之间的任何API更改都将(很可能)得到反映。无论是什么原因,寻求最小化DLL导入使用都不是犯罪吗?
我确定我是否在问题中包含了一些内容:
[DllImport("something32.dll")]
static extern int ClimbWall32Ex(IntPtr32 blah);
你可以这么做:
SomeNamespace.ClimbWall();
这里的每个人都会尖叫:“使用SomeNamespace.ClimbWall();
??”
叹息。
答案 0 :(得分:15)
不确定为什么你不会只使用P / Invoke,但重新启动的另一种方法是将System.Diagnostics.Process.Start
与shutdown
命令结合使用。
示例:
System.Diagnostics.Process.Start("shutdown", "-r");
答案 1 :(得分: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);
}
答案 2 :(得分:7)
您需要调用ExitWindowsEx,它只能通过DllImport
获得