2009-10-14 22 views
6

Có thể, không sử dụng pinvoke, để khởi động lại PC bằng .NET không?Có thể khởi động lại máy tính bằng cách sử dụng .NET "thuần túy" và * không có * bằng cách sử dụng lệnh p/invoke không?

Tôi chỉ lặp lại tiêu đề, nhưng tôi không chắc chắn cách xây dựng nhiều hơn nữa!

Edit:

Tôi có nên nói rằng không muốn sử dụng "shutdown -r" như một giải pháp.

Tôi thật sự sau một cách tinh khiết NET, một cái gì đó như:

Environment.ShutDown();

Nói cách khác, một cái gì đó được duy trì với .NET như các phiên bản mới của Windows xuất hiện.

Sửa 2:

Hãy ngừng hỏi "có gì sai với p/gọi". Những loại câu trả lời đó chính xác là những gì mà người dùng SO có vẻ thích; cách tiếp cận "bên" được cho là để trả lời một câu hỏi. Tuy nhiên, mặc dù không có vấn đề thực sự với p/invoke và tôi sẽ vui vẻ sử dụng nó, những gì trên trái đất là sai với yêu cầu nếu NET có một cách chính thức hơn để đạt được một cái gì đó? Nếu nó nằm trong .NET thì bất kỳ thay đổi API nào giữa các hệ điều hành (rất có thể) sẽ được phản ánh. Dù lý do, nó không phải là một tội phạm để tìm cách giảm thiểu sử dụng nhập khẩu DLL là nó?

tôi chắc chắn rằng nếu tôi có một cái gì đó trong một câu hỏi như:

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

Và bạn chỉ có thể làm:

SomeNamespace.ClimbWall(); 

Mọi người ai ở đây sẽ hét lên: "những gì là sai với việc sử dụng SomeNamespace.ClimbWall(); ?? "

Sigh.

+9

Sự cố khi sử dụng P/Invoke là gì? Nó được sử dụng và nó được sử dụng rộng rãi trong BCL. –

+2

... và thậm chí nếu có một đối tượng phơi bày một phương pháp để khởi động lại tôi muốn đặt cược nó sẽ chỉ được gọi các chức năng API Windows bản địa dưới mui xe. –

+0

Không có vấn đề gì khi sử dụng p/invoke và hầu hết.NET chỉ là một wrapper cho Windows API, nhưng nếu có một cách NET làm việc thì nói chung bạn nên sử dụng nó! Ví dụ, bất kỳ bản cập nhật nào trong các hệ điều hành mới vv có thể không hỗ trợ các cuộc gọi API cũ sẽ được sửa (!) Với bản cập nhật cho .NET – joshcomley

Trả lời

7

Bạn cần phải gọi ExitWindowsEx mà chỉ có sẵn thông qua DllImport

15

Không chắc tại sao bạn không chỉ cần sử dụng P/Invoke, nhưng một trong những cách thay thế của khởi động lại sẽ được sử dụng System.Diagnostics.Process.Start kết hợp với lệnh shutdown.

Ví dụ:

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


Nếu điều đó cũng không phải là chấp nhận được, bạn có thể nhìn vào sử dụng WMI (xem here cho một ví dụ mà có thể có thể được sửa đổi để phù hợp với mục đích của bạn).

+0

Tôi đã xem xét điều này, nhưng nó đang chạy từ một cửa sổ dịch vụ để điều này sẽ không làm việc .. (?) – joshcomley

+0

Chắc chắn là một câu trả lời đúng, nhưng tôi đoán rằng nó không phải là những gì OP được sau khi ... –

+0

Bạn cũng có thể thêm công tắc -f (lực). Một nhược điểm này; nó sẽ thông báo cho người dùng rằng máy sắp khởi động lại, tuy nhiên tôi không nghĩ rằng bạn có thể hủy nó ... – ParmesanCodice

10

Bạn có thể sử dụng WMI để khởi động lại. Dưới đây là từ bộ nhớ, nhưng tôi nghĩ rằng nó là khá gần, mặc dù một chút cẩu thả. :)

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 cho câu trả lời sáng tạo – joshcomley

+4

Sử dụng P/Gọi sẽ ít xấu xí hơn nhiều ... – jnylen

Các vấn đề liên quan