1

以下问题让我发疯。在 C# 中,我试图确保在运行一些代码以获取所有日历事件后关闭 Outlook,但无论我尝试什么,它都不会。谁能帮我?

private void button1_Click(object sender, EventArgs e)
{
    Microsoft.Office.Interop.Outlook.Application outlookApp = null;
    Microsoft.Office.Interop.Outlook.NameSpace mapiNamespace = null;
    Microsoft.Office.Interop.Outlook.MAPIFolder CalendarFolder = null;
    Microsoft.Office.Interop.Outlook.Items outlookCalendarItems = null;

    outlookApp = new Microsoft.Office.Interop.Outlook.Application();
    mapiNamespace = outlookApp.GetNamespace("MAPI");

    CalendarFolder = mapiNamespace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar);
    outlookCalendarItems = CalendarFolder.Items;

    outlookCalendarItems.IncludeRecurrences = true;
    foreach (Microsoft.Office.Interop.Outlook.AppointmentItem item in outlookCalendarItems)
    {
        if (item.IsRecurring)
        {
            Microsoft.Office.Interop.Outlook.RecurrencePattern rp = item.GetRecurrencePattern();
            DateTime first = new DateTime(2008, 8, 31, item.Start.Hour, item.Start.Minute, 0);
            DateTime last = new DateTime(2008, 10, 1);
            Microsoft.Office.Interop.Outlook.AppointmentItem recur = null;

            for (DateTime cur = first; cur <= last; cur = cur.AddDays(1))
            {
                try
                {
                    recur = rp.GetOccurrence(cur);
                    MessageBox.Show(recur.Subject + " -> " + cur.ToLongDateString());
                }
                catch
                {
                }
            }
        }
        else
        {
            MessageBox.Show(item.Subject + " -> " + item.Start.ToLongDateString());
            break;
        }
    }

    ((Microsoft.Office.Interop.Outlook._Application)outlookApp).Quit();
    //outlookApp.Quit();
    //(outlookApp as Microsoft.Office.Interop.Outlook._Application).Quit();

    outlookApp = null;

    System.Runtime.InteropServices.Marshal.ReleaseComObject(outlookCalendarItems);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(CalendarFolder);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(mapiNamespace);
    //System.Runtime.InteropServices.Marshal.ReleaseComObject(outlookApp);

    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(outlookCalendarItems);
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(CalendarFolder);

    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(mapiNamespace);
    //System.Runtime.InteropServices.Marshal.FinalReleaseComObject(outlookApp);
    GC.Collect();
    GC.WaitForPendingFinalizers();

    mapiNamespace = null;
    CalendarFolder = null;
    outlookCalendarItems = null;
}
4

2 回答 2

0

您是否调试过代码以查看应用程序是否曾经访问 OutlookApp.Quit() 命令?

解决此问题的唯一其他方法是彻底杀死进程“Outlook.exe”。

于 2012-04-12T16:12:31.617 回答
0

临时硬核解决方案:

public static class OutlookKiller
{
        [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId", SetLastError = true,
CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
    private static extern long GetWindowThreadProcessId(long hWnd, out long lpdwProcessId);

    public static void Kill(ref Microsoft.Office.Interop.Outlook.Application app)
    {
        long processId = 0;
        long appHwnd = (long)app.Hwnd;

        GetWindowThreadProcessId(appHwnd, out processId);

        Process prc = Process.GetProcessById((int)processId);
        prc.Kill();
    }
}
于 2012-04-12T19:06:01.350 回答