RPC服务器不可用

raf*_*ale 1 c# outlook office-interop

在我的程序中使用Outlook interop时出现间歇性错误.我让用户时不时地报告这个错误,但是不可能在我的最终重现.更奇怪的是,如果他们重新启动程序并再次尝试,则错误消失了.

这是我用来获取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;
    }
}
Run Code Online (Sandbox Code Playgroud)

以及发送实际电子邮件时使用的代码.

    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();
    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不知道错误发生在哪里,因为我无法重现错误.有没有人知道发生了什么?

Han*_*ant 7

这是进程互操作的经典问题,您可以解决其他进程的所有错误和崩溃问题."RPC服务器不可用"是一个非常通用的错误,并不意味着"过程不再起作用".一些简单的原因,它可能只是崩溃或用户终止它.Outlook通常是一个麻烦制造者,它不完全是Office中最稳定的程序.

使用Process.GetProcessesByName()解决这个问题是一个公平的尝试,但它不太可行.用户通常已经运行Outlook供自己使用,您也会看到该实例.您无法判断您看到的进程是否是您启动的进程并与您的olk实例匹配,或者是用户正在查看的进程.

正确的解决方法是在获得异常时重新创建olk实例.这可能很难处理,因为当您深深嵌套在代码中时可能会生成它.但最好不要修复这种情况,因为这会暗示你的代码导致崩溃,你不想隐藏这个问题.实施"金丝雀测试",在开始做一些非平凡的事情之前,先嗅一眼无辜的财产.如果这导致异常,则重新创建实例.测试一下,我不是100%确定旧的olk实例会在最终确定时炸毁你的程序.你应该通过使用任务管理器杀死Outlook.exe来获得一个repro.