Windows调度程序运行c#编译代码时的function

好吧,我有一个应用程序,每小时通过Windows调度程序运行。 它运行成功,我可以告诉Windows调度程序。 当我点击可执行文件时,应用程序运行没有问题。

当我通过Windows调度程序运行相同的应用程序,它不会按预期工作。

它应该视而不见,但并不重新开放。 相反,它启动的可执行文件,但Outlook应用程序不显示在我的桌面上。

我的应用程序应该这样做:closures我的电子邮件,发送电子邮件,打开Outlook。

我首先需要closuresOutlook,因为如果在我尝试发送电子邮件之前没有closures它,它将尝试访问数据文件,并且因为我的手机Windows调度程序不能在我的桌面上启动电子邮件打开数据文件。

static void Main(string[] args) { foreach(Process proc in Process.GetProcesses()) { if(proc.ProcessName.Equals("OUTLOOK")) { proc.Kill(); } } //Removed code which sends emails. openOutlook(); } private static void openOutlook() { Thread.Sleep(1000); Process.Start(@"C:\Program Files (x86)\Microsoft Office\Office14\OUTLOOK.exe"); } 

从Windows调度程序(服务)自动化Outlook不是一个好主意。

Microsoft目前不推荐并不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序,因为Office可能会出现不稳定的行为和/或在此环境中运行Office时发生死锁。

如果您正在构建一个在服务器端上下文中运行的解决方案,则应该尝试使用已经安全的组件进行无人值守的执行。 或者,您应该尝试找到允许至少部分代码运行在客户端的备选方案。 如果从服务器端解决方案使用Office应用程序,那么应用程序将缺少许多必要的功能来成功运行。 此外,您将面临整体解决方案稳定性的风险。 请阅读“服务器端Office自动化的注意事项”文章中的更多内容。

作为解决方法,您可以考虑使用低级API – 扩展MAPI。 或围绕该API的任何第三方包装,例如Redemption。

我提出的最佳解决方案是在发送电子邮件之前关闭Outlook。

如果Outlook的进程打开,则杀死所有实例; 继续根据需要发送电子邮件。 程序结束后,手动打开Outlook。

一个可能的选择是创建一个VBA,在特定时间附加电子邮件。 您也可以查看此页面上提供的其他链接。

调度程序是一种在当前用户上下文中运行的服务,与当前登录的用户不同。 Outlook将在该用户上下文中打开,并且当前登录的用户将不会看到它。