C# Can';在Outlook运行时,在前台出现非Outlook窗口之前,无法获取Outlook.Application

C# Can';在Outlook运行时,在前台出现非Outlook窗口之前,无法获取Outlook.Application,c#,.net,outlook,office-interop,com-interop,C#,.net,Outlook,Office Interop,Com Interop,Marshal.GetActiveObject(“Outlook.Application”)启动Outlook并在运行时继续,直到非Outlook窗口变为活动的前台窗口时,抛出操作不可用(HRESULT中的异常:0x800401E3(MK_E_不可用)) 我正在Windows 10版本1803版本17134.523上运行Outlook版本1901版本11231.20130(这是我的本地计算机)。我观察到客户机的行为不是这样的。这发生在使用.NET 4.5.2和Microsoft.Office.I

Marshal.GetActiveObject(“Outlook.Application”)
启动Outlook并在运行时继续,直到非Outlook窗口变为活动的前台窗口时,抛出
操作不可用(HRESULT中的异常:0x800401E3(MK_E_不可用))

我正在Windows 10版本1803版本17134.523上运行Outlook版本1901版本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
Outlook运行时,我希望看到:

app
got app
如果自Outlook启动后将非Outlook窗口设置为前台(即不是资源管理器或检查器窗口),则会发生这种情况。如果Outlook正在运行且始终处于前台,我会看到:

app
Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))
在黑暗中拍摄时,当我注意到发生这种情况时,我尝试通过执行以下操作来“启动”互操作:

bootApplication = new Microsoft.Office.Interop.Outlook.Application();

毫无效果。任何投入都会被重视。谢谢大家!

不要将
GetActiveObject
与Outlook一起使用-它是一个单例,因此创建
Outlook的新实例。如果该
对象已在运行,则应用程序将返回指向现有实例的指针

是否有可能Outlook作为一个用户(比如您的用户)运行,而应用程序作为另一个用户(例如管理员)运行?我不是最初的海报,但我有同样的问题。我已尝试以管理员身份运行Outlook和应用程序,但此问题仍然存在。如果您只使用新的Microsoft.Office.Interop.Outlook.Application(),我仍然会得到
{“操作不可用(来自HRESULT:0x800401E3(MK_E_不可用)的异常”)
@ThomasZhang,您可以处理该实例吗?互操作应该为您提供已经运行的application@CamiloTerevinto我不确定。请注意,如果我让程序保持运行并最小化Outlook的资源管理器,例如,我会突然访问
Outlook.Application
。我假设这意味着在
应用程序上调用
封送.ReleaseComObject
也没有意义,但对于通过
app
访问的每个com对象,我仍然必须这样做。这是正确的吗?这不会有什么坏处,而且您需要小心使用多点表示法,因为它会创建无法显式释放的隐式变量。