Shr*_*oom 6 .net c# outlook com-interop office-interop
Marshal.GetActiveObject("Outlook.Application")Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))在 Outlook 启动时引发并在运行时继续,直到非 Outlook 窗口成为活动的前景窗口。
我在 Windows 10 Version 1803 Build 17134.523(这是我的本地机器)上运行 Outlook Version 1901 Build 11231.20130。我观察到不以这种方式运行的客户端机器。这发生在使用 .NET 4.5.2 和 Microsoft.Office.Interop.Outlook 版本 15.0.4797.1003 通过 NuGet 获得的 WPF 应用程序中。
我反复运行以下代码。如上所述,一旦最小化 Outlook 实例或将非 Outlook 窗口设置为前台,它就会成功,但在发生这种情况之前,它可能会持续失败(下面的输出)。我试图暂停约 20-30 秒,让 Outlook 有时间加载,但仍然得到相同的结果。
// Detect that the active window is an Outlook window
Outlook.Application app = null;
// Optional: Wait for Outlook to load 20-30 sec using Thread.Sleep
try
{
Debug.WriteLine("app");
app = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application");
Debug.WriteLine("got app");
}
catch (Exception exception)
{
Debug.WriteLine(exception.Message);
}
// Do things with app
Run Code Online (Sandbox Code Playgroud)
在 Outlook 运行时,我希望看到:
app
got app
Run Code Online (Sandbox Code Playgroud)
如果在 Outlook 启动后将非 Outlook 窗口设置为前景(即不是资源管理器或检查器窗口),则会发生这种情况。如果 Outlook 正在运行并且一直处于前台,我会看到:
app
Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))
Run Code Online (Sandbox Code Playgroud)
作为黑暗中的一个镜头,当我注意到这种情况发生时,我尝试通过执行以下操作来“启动”互操作:
bootApplication = new Microsoft.Office.Interop.Outlook.Application();
Run Code Online (Sandbox Code Playgroud)
没有效果。任何投入都会受到重视。谢谢!
不要GetActiveObject与 Outlook 一起使用- 它是一个单例,因此Outlook.Application如果它已经在运行,则创建对象的新实例将返回指向现有实例的指针。