2009-10-14 4 views
6

E 'possibile, senza utilizzare pinvoke, riavviare un PC utilizzando .NET?E 'possibile riavviare un PC usando "pure" .NET e * senza * usando p/invoke?

Ho appena ripetuto il titolo, ma non sono troppo sicuro di come elaborare ulteriormente!

Edit:

Avrei detto che non vogliono usare "shutdown -r" come una soluzione.

ero davvero dopo un modo puro .NET, qualcosa di simile:

Environment.ShutDown();

In altre parole, qualcosa che viene mantenuto con .NET emergano nuove versioni di Windows.

Edit 2:

prega smettere di chiedere "che cosa c'è di sbagliato con p/invocano". Questo tipo di risposte sono esattamente ciò che gli utenti SO sembrano amare; il supposto approccio "laterale" per rispondere a una domanda. Tuttavia, sebbene non ci siano problemi reali con p/invoke e lo userò felicemente, cosa diavolo è sbagliato nel chiedere se .NET abbia un modo più ufficiale per ottenere qualcosa? Se è in .NET, qualsiasi modifica API tra i sistemi operativi verrà (molto probabilmente) riflessa. Qualunque sia la ragione, non è un crimine cercare di ridurre al minimo l'utilizzo delle importazioni DLL?

Sono sicuro che se ho inserito qualcosa in una domanda del tipo:

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

E si può solo fare:

SomeNamespace.ClimbWall(); 

Tutti uno qui sarebbe urlare: "ciò che è sbagliato con l'utilizzo SomeNamespace.ClimbWall(); ??"

Sigh.

+9

Qual è il problema con l'utilizzo di P/Invoke? È lì per essere usato ed è ampiamente utilizzato all'interno del BCL. –

+2

... e anche se ci fosse un oggetto che espone un metodo per il riavvio, scommetterei che sarebbe solo chiamando le funzioni native dell'API di Windows sotto il cofano. –

+0

Non c'è un problema con l'utilizzo di p/invoke e la maggior parte di.NET è solo un wrapper per l'API di Windows, ma se esistesse un modo .NET per fare le cose, in generale dovresti usarlo! Ad esempio, eventuali aggiornamenti in nuovi SO ecc. Che potrebbero non supportare le vecchie chiamate API saranno corretti (!) Con un aggiornamento a .NET – joshcomley

risposta

7

è necessario chiamare ExitWindowsEx che è disponibile solo attraverso DllImport

15

Non certo perché non sarebbe solo utilizzare P/Invoke, ma un modo alternativo per riavviare sarebbe quella di utilizzare System.Diagnostics.Process.Start in combinazione con il comando shutdown.

Esempio:

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


Se questo non è accettabile, si potrebbe considerare di usare WMI (vedi here per un esempio che potrebbe probabilmente essere modificato per soddisfare i vostri scopi).

+0

Avevo preso in considerazione questo, ma è in esecuzione da un servizio di Windows, quindi questo non funzionerà .. (?) – joshcomley

+0

Sicuramente una risposta corretta, ma suppongo che non è ciò che l'OP era dopo ... –

+0

Si potrebbe anche aggiungere l'interruttore -f (forza). Uno svantaggio di questo; informerà l'utente che la macchina sta per riavviarsi, tuttavia non penso che tu possa cancellarla ... – ParmesanCodice

10

È possibile utilizzare WMI per riavviare. Qui sotto è dalla memoria, ma penso che sia abbastanza vicino, anche se un po 'sciatto. :)

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); 
} 
+1

+1 per la risposta creativa – joshcomley

+4

L'utilizzo di P/Invoke sarebbe molto meno brutto ... – jnylen

Problemi correlati