繁体   English   中英

是否可以使用“纯”.NET和*重启PC而不使用p / invoke?

[英]Is it possible to restart a PC using “pure” .NET and *without* using p/invoke?

是否可以在不使用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();有什么问题SomeNamespace.ClimbWall(); ??”

叹。

不确定为什么你不会只使用P / Invoke,但重新启动的另一种方法是将System.Diagnostics.Process.Startshutdown命令结合使用。

例:

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


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

您可以使用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);
}

您需要调用ExitWindowsEx,它只能通过DllImport获得

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM