2009-10-14 14 views
6

Czy możliwe jest, bez użycia pinvoke, ponowne uruchomienie komputera przy użyciu .NET?Czy można ponownie uruchomić komputer przy użyciu "czystego" .NET i * bez * przy użyciu p/invoke?

Po prostu powtórzyłem tytuł, ale nie jestem zbyt pewny, jak rozwinąć o wiele więcej!

Edit:

Powinienem wspomnieć, że nie chce użyć "shutdown -r" jako rozwiązanie.

byłem naprawdę po czystej NET sposób, coś jak:

Environment.ShutDown();

Innymi słowy, coś, co jest utrzymywany z .NET jako nowe wersje Windows powstać.

Edit 2:

Proszę przystanek pytaniem "co się stało z p/wywołać". Tego rodzaju odpowiedzi są dokładnie tym, co użytkownicy SO wydają się kochać; rzekome "boczne" podejście do odpowiedzi na pytanie. Jednak, mimo że nie ma prawdziwego problemu z p/invoke i z przyjemnością go wykorzystam, co jest nie tak z pytaniem, czy .NET ma bardziej oficjalny sposób na osiągnięcie czegoś? Jeśli jest w .NET, to wszelkie zmiany API między systemami (najprawdopodobniej) zostaną odzwierciedlone. Niezależnie od powodu, nie jest przestępstwem dążenie do zminimalizowania użycia importu DLL, prawda?

jestem pewien, czy zawarte w pytaniu coś takiego:

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

A może po prostu zrobić:

SomeNamespace.ClimbWall(); 

Każdy jeden tutaj by krzyczeć: „Co jest złego w używaniu SomeNamespace.ClimbWall(); ?? "

Westchnienie.

+9

Na czym polega problem z korzystaniem z P/Invoke? Jest tam do wykorzystania i jest szeroko stosowany w BCL. –

+2

... a nawet gdyby istniał obiekt ujawniający metodę ponownego rozruchu, założę się, że byłoby to po prostu wywołanie natywnych funkcji Windows API pod maską. –

+0

Nie ma problemu z używaniem p/invoke i większością.NET to po prostu wrapper dla Windows API, ale gdyby istniał sposób .NET, to ogólnie rzecz biorąc, powinieneś go użyć! Na przykład wszelkie aktualizacje w nowych systemach operacyjnych itp., Które mogą nie obsługiwać starych wywołań API, zostaną naprawione (!) Z aktualizacją do .NET – joshcomley

Odpowiedz

7

Trzeba zadzwonić ExitWindowsEx która jest dostępna tylko poprzez dllimport

15

Nie wiem, dlaczego nie wystarczy użyć P/Invoke, ale jeden alternatywny sposób na ponowne uruchomienie byłoby użyć System.Diagnostics.Process.Start w połączeniu z komendą shutdown.

Przykład:

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


Jeśli to również nie jest dopuszczalne, można zajrzeć do korzystania WMI (patrz here na przykład, że mógłby prawdopodobnie być zmodyfikowany do własnych celów).

+0

Rozważałem to, ale działa z usługi Windows, więc to nie zadziała. (?) – joshcomley

+0

Zdecydowanie poprawna odpowiedź, ale myślę, że to nie jest to, co PO było po ... –

+0

Możesz również dodać przełącznik -f (force). Jedną wadą tego; poinformuje użytkownika, że ​​maszyna ma się ponownie uruchomić, ale nie sądzę, że możesz ją anulować ... – ParmesanCodice

10

Możesz użyć WMI do ponownego uruchomienia. Poniżej jest z pamięci, ale myślę, że jest dość blisko, choć trochę zaniedbana. :)

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 dla kreatywnej odpowiedzi – joshcomley

+4

Używanie P/Invoke byłoby o wiele mniej brzydkie ... – jnylen

Powiązane problemy