C# 关闭从代码创建并打开的Outlook联系人窗口会关闭Outlook本身(错误)?

C# 关闭从代码创建并打开的Outlook联系人窗口会关闭Outlook本身(错误)?,c#,wpf,outlook,C#,Wpf,Outlook,我有一个C#WPF应用程序,它读取大量本地Outlook联系人并将其存储在内存中。在应用程序中执行搜索时,将生成一个ResultObject列表,并将其绑定到我的应用程序屏幕上显示的列表框。ResultObject的一个属性是它派生自的Outlook联系人(Outlook.ContactItem),我使用它绑定到按钮标记属性(可以是您想要分配给它的任何内容),这样当用户单击他们想要的结果旁边的按钮时,Outlook联系人窗口本身将打开以显示联系人 当我最初拉取联系人列表时,需要并创建Outloo

我有一个C#WPF应用程序,它读取大量本地Outlook联系人并将其存储在内存中。在应用程序中执行搜索时,将生成一个ResultObject列表,并将其绑定到我的应用程序屏幕上显示的列表框。ResultObject的一个属性是它派生自的Outlook联系人(Outlook.ContactItem),我使用它绑定到按钮标记属性(可以是您想要分配给它的任何内容),这样当用户单击他们想要的结果旁边的按钮时,Outlook联系人窗口本身将打开以显示联系人

当我最初拉取联系人列表时,需要并创建Outlook实例,并且正在运行的进程就在那里

public Outlook.Application usersOutlook=new Outlook.Application()

问题是,在我的代码为与单击的按钮关联的对象打开Outlook联系人窗口后:

buttonContact=(Outlook.ContactItem)((按钮)sender.Tag; 按钮contact.Display()

然后用户关闭该窗口,我正在运行的Outlook.Application(及其进程/PID)也随之关闭—这不是我想要的。我需要Outlook保持运行,以便用户希望看到的下一个联系人。如果Outlook仍在运行,则显示联系人的按钮将失败。如果我强行创建一个新的Outlook实例,从而创建一个新的进程,单击按钮显示联系人将引发一个严重的“RPC服务器不可用””错误,我还没有解决/解决这个错误


我的应用程序正常运行的唯一方法是,如果用户自己启动Outlook,那么整个应用程序都在他们的机器上运行,然后在我的应用程序运行时让它保持运行。这样,当他们通过“我的代码”关闭Outlook打开的联系人时,Outlook本身会继续运行,然后用户希望看到的下一个联系人就会工作。这对我的客户来说是不可接受的,他们要求Outlook运行,而不是用户的要求。该应用程序需要在代码隐藏中创建一个隐藏实例,并在我运行的应用程序的生命周期内对其进行维护。

我建议将Outlook项目的id保留在控件的Tag属性中。因此,您将能够使用任何Outlook实例(即使它不存在)将它们恢复回来。Namespace类的方法返回由指定的条目ID(如果有效)标识的Microsoft Outlook项。有关条目ID的详细信息,请参见属性:

MAPI存储提供程序在其存储中创建项时会分配唯一的ID字符串。因此,在保存或发送Outlook项目之前,不会为其设置EntryID属性。当项目移动到另一个存储时,条目ID会发生更改,例如,从收件箱移动到Microsoft Exchange Server公用文件夹,或从一个个人文件夹(.pst)文件移动到另一个.pst文件。除非不移动项,否则解决方案不应依赖于唯一的EntryID属性。EntryID属性返回MAPI长期条目ID


我建议将Outlook项目的id保留在控件的Tag属性中。因此,您将能够使用任何Outlook实例(即使它不存在)将它们恢复回来。Namespace类的方法返回由指定的条目ID(如果有效)标识的Microsoft Outlook项。有关条目ID的详细信息,请参见属性:

MAPI存储提供程序在其存储中创建项时会分配唯一的ID字符串。因此,在保存或发送Outlook项目之前,不会为其设置EntryID属性。当项目移动到另一个存储时,条目ID会发生更改,例如,从收件箱移动到Microsoft Exchange Server公用文件夹,或从一个个人文件夹(.pst)文件移动到另一个.pst文件。除非不移动项,否则解决方案不应依赖于唯一的EntryID属性。EntryID属性返回MAPI长期条目ID


Outlook就是这样做的—在最后一个窗口(资源管理器或检查器)关闭时自动关闭,即使仍然存在对Outlook对象模型对象的引用。唯一的例外是Explorer和Inspector对象,即使它们不可见


尝试从MAPIFolder对象(MAPIFolder.GetExplorer)的实例检索资源管理器对象,并将其保持为引用状态,直到完成。您不必对它做任何事情,只需在全局/类变量中引用它即可。MAPIFolder可以是任何Outlook文件夹,例如Namespace.GetDefaultFolder(olFolderContacts)返回的默认联系人文件夹

Outlook就是这样做的-在最后一个窗口(资源管理器或检查器)关闭时自动关闭,即使仍然存在对Outlook对象模型对象的引用。唯一的例外是Explorer和Inspector对象,即使它们不可见

尝试从MAPIFolder对象(MAPIFolder.GetExplorer)的实例检索资源管理器对象,并将其保持为引用状态,直到完成。您不必对它做任何事情,只需在全局/类变量中引用它即可。MAPIFolder可以是任何Outlook文件夹,例如Namespace.GetDefaultFolder(olFolderContacts)返回的默认联系人文件夹