簡體   English   中英

RPC服務器不可用

[英]RPC server is unavailable

在程序中使用Outlook互操作時出現間歇性錯誤。 我不時讓用戶報告此錯誤,但最終無法重現。 更奇怪的是,如果他們重新啟動程序並重試,則錯誤消失了。

這是我用來獲取Outlook引用的代碼。

public class CommonStuff
{
    public static void Initialize()
    {
        olk = new Microsoft.Office.Interop.Outlook.Application();
        olk.ItemSend += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemSendEventHandler(OutlookInterop_ItemSend);
    }

    public static Microsoft.Office.Interop.Outlook.Application GetOutlook()
    {
        if (Process.GetProcessesByName("OUTLOOK").Count() == 0) //previous attempt at fixing this issue, and i'm not sure if i even need this
        {
            olk = new Microsoft.Office.Interop.Outlook.Application();
        }
        return olk;
    }
}

以及發送實際電子郵件時使用的代碼。

    public void SendEmail()
    {
        Microsoft.Office.Interop.Outlook.MailItem eMail = (Microsoft.Office.Interop.Outlook.MailItem)CommonStuff.GetOutlookApp().CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
        eMail.Subject = String.Format("Subject");
        eMail.To = "email@things.com";
        eMail.Companies = "Company";
        eMail.Body = "blah blah blah";
        eMail.Attachments.Add(GetCrystalReportPDF());
        ((Microsoft.Office.Interop.Outlook._MailItem)eMail).Display();
    }

不幸的是,我不知道錯誤在哪里發生,因為我無法重現該錯誤。 有人對發生的事情有任何線索嗎?

這是進程互操作的經典問題,您還需要解決該其他進程的所有錯誤和崩潰。 “ RPC服務器不可用”是一個非常常見的錯誤,除了“該進程不再起作用”以外,其含義不外。 有幾個簡單的原因,它可能已經崩潰或用戶終止了它。 一般而言,Outlook是一個麻煩制造者,它並不是Office中最穩定的程序。

您使用Process.GetProcessesByName()的變通辦法是一個合理的嘗試,但不太可能。 用戶通常已經可以運行Outlook以供自己使用,您還將看到該實例。 您無法確定您看到的進程是您啟動並匹配olk實例的進程,還是用戶正在查看的進程。

正確的解決方法是在收到異常時重新創建您的olk實例。 這可能很難處理,因為它可能是在您深深嵌套在代碼中時生成的。 但是最好不要修復這種情況,因為這暗示了代碼導致崩潰,您不想隱藏該問題。 實施“金絲雀測試”,在開始做一些不平凡的事情之前,先對一個無辜的財產進行嗅探。 如果那會引發異常,請重新創建實例。 做這個測試,我不確定百分百確定舊的olk實例將在程序結束時轟炸您的程序。 您應該通過使用任務管理器殺死Outlook.exe來獲得再現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM