好的,我有一个通过 Windows 调度程序每小时运行一次的应用程序。它运行成功,我可以通过 Windows 调度程序判断。当我单击可执行文件时,应用程序运行没有问题。
当我通过 Windows 调度程序运行相同的应用程序时,它没有按预期工作。
它会正常关闭 outlook,但不会重新打开它。 相反,它会启动可执行文件,但 Outlook 应用程序不会显示在我的桌面上。
我的应用程序应该这样做:关闭我的电子邮件、发送电子邮件、打开 outlook。
我需要首先关闭 Outlook,因为如果我在尝试发送电子邮件之前不关闭它,它将尝试访问数据文件,并且因为我在 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 应用程序,该应用程序将缺少许多成功运行所必需的功能。此外,您将承担整体解决方案稳定性的风险。在 Considerations for server-side Automation of Office 中阅读更多相关信息文章。
作为解决方法,您可以考虑使用低级 API - 扩展 MAPI。或者围绕该 API 的任何第三方包装器,例如 Redemption。
关于c# - 运行 c# 编译代码时的 Windows 调度程序功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35019536/