3 回答

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
這將永遠(yuǎn)行不通,至少在Windows Vista或更高版本中不行。關(guān)鍵問(wèn)題是您試圖從Windows服務(wù)而不是標(biāo)準(zhǔn)Windows應(yīng)用程序中執(zhí)行此操作。您顯示的代碼將在Windows Forms,WPF或控制臺(tái)應(yīng)用程序中完美運(yùn)行,但在Windows Service中根本無(wú)法運(yùn)行。
Windows Services無(wú)法啟動(dòng)其他應(yīng)用程序,因?yàn)樗鼈兾丛谌魏翁囟ㄓ脩舻纳舷挛闹羞\(yùn)行。與常規(guī)Windows應(yīng)用程序不同,服務(wù)現(xiàn)在在隔離的會(huì)話中運(yùn)行,并且禁止與用戶或桌面進(jìn)行交互。這樣就沒(méi)有地方可以運(yùn)行該應(yīng)用程序。
這些相關(guān)問(wèn)題的答案提供了更多信息:
引發(fā)Timer事件時(shí),Windows Service如何啟動(dòng)進(jìn)程?
Windows中的哪個(gè)進(jìn)程是用戶特定的?
Windows服務(wù)(允許與桌面交互的服務(wù))
到目前為止,您可能已經(jīng)發(fā)現(xiàn),解決問(wèn)題的最佳方法是創(chuàng)建一個(gè)標(biāo)準(zhǔn)的Windows應(yīng)用程序而不是服務(wù)。這些文件設(shè)計(jì)為由特定用戶運(yùn)行,并與該用戶的桌面相關(guān)聯(lián)。這樣,您可以使用已經(jīng)顯示的代碼隨時(shí)運(yùn)行其他應(yīng)用程序。
假設(shè)您的控制臺(tái)應(yīng)用程序不需要任何接口或任何輸出,另一種可能的解決方案是指示該過(guò)程不要?jiǎng)?chuàng)建窗口。這將防止Windows阻止您創(chuàng)建進(jìn)程,因?yàn)樗鼘⒉辉僬?qǐng)求創(chuàng)建控制臺(tái)窗口。您可以在有關(guān)相關(guān)問(wèn)題的答案中找到相關(guān)代碼。

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可以從Windows任務(wù)計(jì)劃程序中使用此工具,有許多類(lèi)似TaskScheduler的庫(kù)可以為您提供幫助。
例如,考慮我們要計(jì)劃一個(gè)任務(wù),該任務(wù)將在五秒鐘后執(zhí)行一次:
using (var ts = new TaskService())
{
var t = ts.Execute("notepad.exe")
.Once()
.Starting(DateTime.Now.AddSeconds(5))
.AsTask("myTask");
}
notepad.exe將在五秒鐘后執(zhí)行。
有關(guān)詳細(xì)信息,請(qǐng)?jiān)L問(wèn)Wiki。
如果您知道該程序集中需要哪個(gè)類(lèi)和方法,則可以這樣自己調(diào)用它:
Assembly assembly = Assembly.LoadFrom("yourApp.exe");
Type[] types = assembly.GetTypes();
foreach (Type t in types)
{
if (t.Name == "YourClass")
{
MethodInfo method = t.GetMethod("YourMethod",
BindingFlags.Public | BindingFlags.Instance);
if (method != null)
{
ParameterInfo[] parameters = method.GetParameters();
object classInstance = Activator.CreateInstance(t, null);
var result = method.Invoke(classInstance, parameters.Length == 0 ? null : parameters);
break;
}
}
}
- 3 回答
- 0 關(guān)注
- 2097 瀏覽
添加回答
舉報(bào)