[英]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.