C# Outlook互操作引用泄漏的一种特殊情况

C# Outlook互操作引用泄漏的一种特殊情况,c#,outlook,office-interop,C#,Outlook,Office Interop,即使我尽了最大努力,我仍然会泄露互操作引用,Outlook不会自动关闭就是明证。我已将问题缩小到最小的样本,并确定了故障线路,您能找出我遗漏的内容吗 FinalReleaseComObjectSafe接受一个对象并在其上调用System.Runtime.InteropServices.Marshal.FinalReleaseComObject(o)(如果该对象不为null) Outlook.Application app = null; Outlook.NameSpace ns = null;

即使我尽了最大努力,我仍然会泄露互操作引用,Outlook不会自动关闭就是明证。我已将问题缩小到最小的样本,并确定了故障线路,您能找出我遗漏的内容吗

FinalReleaseComObjectSafe接受一个对象并在其上调用System.Runtime.InteropServices.Marshal.FinalReleaseComObject(o)(如果该对象不为null)

Outlook.Application app = null;
Outlook.NameSpace ns = null;
Outlook.MAPIFolder explorerFolder = null;
Outlook.Explorers explorers = null;
Outlook.Explorer explorer = null;           

try
{
    app = new Outlook.Application();
    ns = app.Session;
    explorerFolder = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts);    
    explorers = app.Explorers;
    explorer = explorers.Add(explorerFolder); // If I omit this line Outlook closes by itself
}
finally
{   
    CSharpUtilities.FinalReleaseComObjectSafe(explorer);
    CSharpUtilities.FinalReleaseComObjectSafe(explorers);
    CSharpUtilities.FinalReleaseComObjectSafe(explorerFolder);
    CSharpUtilities.FinalReleaseComObjectSafe(ns);
    CSharpUtilities.FinalReleaseComObjectSafe(app);
    GC.Collect();
    GC.WaitForPendingFinalizers();
}
使用Application类的方法关闭应用程序。您是否在Outlook中运行任何加载项

首先,我建议改用ReleaseComObject方法。如果其他任何人继续使用引用/发布的对象,FinalReleaseComObject可能会引入新的bug。不需要使用GC的方法强制刷取堆。该条规定如下:

用于在使用完Outlook对象后释放该对象。然后在Visual Basic中将变量设置为Nothing(在C#中为null),以释放对对象的引用


何时何地运行代码?

调用Quit会提示“是否要删除已删除文件文件夹中的所有文件?”对话框,因此它不是一个选项。可以在随机时间调用此代码以收集联系人。调用该方法时,Outlook可能正在运行或未运行。下面是我的代码:我的应用程序通常全天候运行,这就是为什么我要在一个单独的appdomain中执行所有互操作代码,以避免与Outlook互操作相关的内存泄漏。不过Outlook的行为很奇怪,在多次调用此方法和其他类似方法后,它最终会冻结/崩溃……我的引用清理似乎大部分都在工作:起初,我经常遇到打开的Exchange对象太多的异常,但现在不再发生。“outlook窗口无法打开,请尝试关闭窗口或程序,然后再试一次”(虽然内存足够)。您是否在服务器端自动运行outlook?我不敢(;我正在收集本地outlook联系人、公共outlook联系人和全局通讯录联系人)(通过Outlook而不是DirectorySearcher)在零配置电话簿/拨号助手/呼叫通知工具中显示它们。EWS显然是毫无疑问的,因为用户必须知道他们的Outlook详细信息被认为是不切实际的。它正在工作:我可以成功收集所有联系人!但我真的希望避免Outlook冻结和崩溃,我认为这是由于我的代码泄漏引用。