3 回答
TA贡献1859条经验 获得超6个赞
这将永远行不通,至少在Windows Vista或更高版本中不行。关键问题是您试图从Windows服务而不是标准Windows应用程序中执行此操作。您显示的代码将在Windows Forms,WPF或控制台应用程序中完美运行,但在Windows Service中根本无法运行。
Windows Services无法启动其他应用程序,因为它们未在任何特定用户的上下文中运行。与常规Windows应用程序不同,服务现在在隔离的会话中运行,并且禁止与用户或桌面进行交互。这样就没有地方可以运行该应用程序。
这些相关问题的答案提供了更多信息:
引发Timer事件时,Windows Service如何启动进程?
Windows中的哪个进程是用户特定的?
Windows服务(允许与桌面交互的服务)
到目前为止,您可能已经发现,解决问题的最佳方法是创建一个标准的Windows应用程序而不是服务。这些文件设计为由特定用户运行,并与该用户的桌面相关联。这样,您可以使用已经显示的代码随时运行其他应用程序。
假设您的控制台应用程序不需要任何接口或任何输出,另一种可能的解决方案是指示该过程不要创建窗口。这将防止Windows阻止您创建进程,因为它将不再请求创建控制台窗口。您可以在有关相关问题的答案中找到相关代码。
TA贡献1895条经验 获得超3个赞
您可以从Windows任务计划程序中使用此工具,有许多类似TaskScheduler的库可以为您提供帮助。
例如,考虑我们要计划一个任务,该任务将在五秒钟后执行一次:
using (var ts = new TaskService())
{
var t = ts.Execute("notepad.exe")
.Once()
.Starting(DateTime.Now.AddSeconds(5))
.AsTask("myTask");
}
notepad.exe将在五秒钟后执行。
有关详细信息,请访问Wiki。
如果您知道该程序集中需要哪个类和方法,则可以这样自己调用它:
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 关注
- 2055 浏览
添加回答
举报