2009-10-14 15 views
6

.NET kullanarak bir bilgisayarı yeniden başlatmak için pinvoke kullanmadan mümkün mü?PC'yi "pure" .NET kullanarak ve * p * invoke kullanarak * yeniden başlatmak mümkün mü?

Sadece başlığı tekrarladım, ama daha fazla nasıl detaylandırılacağından emin değilim!

Düzenleme:

Ben çözüm olarak "kapatma -r" kullanmak istemiyorum bahsetmeliydik. Başka bir deyişle

Environment.ShutDown();

, Windows'un yeni sürümleri ortaya olarak .NET ile korunur şey:

bir şey gibi saf bir .NET yol sonra gerçekten.

Düzenleme 2:

Lütfen "Ne p nesi/çağırmak" soran dur. Bu tür cevaplar, SO kullanıcılarının tam olarak sevdiği gibi görünüyor; Bir soruya cevap vermek için varsayılan “yanal” yaklaşım. Ancak, p/invoke ile gerçek bir sorun olmamasına rağmen ve ben mutlu bir şekilde kullanacağım, ancak, .NET'in bir şeyleri başarmak için daha resmi bir yolu olup olmadığını sormak, yeryüzünde neyin yanlış olduğunu? .NET'de ise, OS'ler arasında herhangi bir API değişmesi (büyük olasılıkla) yansıtılır. Nedeni ne olursa olsun, DLL ithalat kullanımını en aza indirmek için bir suç değil mi?

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

Ve tıpkı olabilir: burada

SomeNamespace.ClimbWall(); 

Herkes bir çığlık olacaktır: Ben böyle bir söz konusu şey dahil eğer

eminim "Ne SomeNamespace.ClimbWall(); kullanarak derdin ??"

Sigh.

+9

P/Invoke kullanımıyla ilgili sorun nedir? Kullanılacak ve BCL içinde yaygın olarak kullanılmaktadır. –

+2

... ve yeniden başlatma için bir yöntem ortaya çıkaran bir nesne olsa bile, yalnızca Windows API işlevlerini başlık altında çağırıyordum. –

+0

p/invoke kullanımı ile ilgili bir sorun yoktur ve çoğu.NET, yalnızca Windows API için bir sarıcıdır, ancak bir şeyler yapmanın bir NET yolu varsa, o zaman genel olarak kullanmalısınız! Örneğin, eski API çağrılarını desteklemeyen yeni işletim sistemi vb. Güncelleştirmeler, .NET – joshcomley

cevap

7

Sen Dllımport

aracılığıyla
15
sadece P/Invoke kullanmak ister emin niçin

ancak shutdown komutla birlikte System.Diagnostics.Process.Start kullanmak olacaktır yeniden başlatmadan biri alternatif bir yol yalnızca ExitWindowsEx araman gerekiyor.

Örnek: O da kabul edilebilir değilse

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


, siz (muhtemelen amacınıza uygun şekilde modifiye edilebilir bir örnek için here bakınız) WMI kullanarak içine görünebilir.

+0

Bunu düşünmüştüm, ama bu bir pencere servisinden çalışıyor, bu işe yaramayacak .. (?) – joshcomley

+0

Kesinlikle doğru bir cevap, ama sanırım OP'in peşinde değil ... –

+0

Ayrıca şunları da ekledi: -f (kuvvet) anahtarı. Bunun bir dezavantajı; kullanıcıyı makinenin yeniden başlatılacağı konusunda bilgilendirir, ancak iptal edeceğinizi sanmıyorum ... – ParmesanCodice

10

Yeniden başlatmak için WMI'yi kullanabilirsiniz. Aşağıda hafızadan, ama biraz özensiz olsa da, oldukça yakın olduğunu düşünüyorum. :)

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 Yaratıcı yanıt için – joshcomley

+4

P/Invoke kullanımı çok daha az çirkin olurdu ... – jnylen