如何处理System.Runtime.InteropServices.COMException(0x800706BA):RPC服务器不可用。 (来自HRESULT的异常:0x800706BA)

时间:2019-06-27 11:40:14

标签: c# winforms office-interop comexception

我正在开发一个Windows应用程序,可以在其中操纵Word应用程序。更具体地说,我正在打开Word文档,但是当我退出它并尝试打开另一个Word文档时,就会出现此错误。

如何处理

  

System.Runtime.InteropServices.COMException(0x800706BA):RPC服务器不可用。 (来自HRESULT的异常:0x800706BA)位于Microsoft.Office,Word.ApplicationClass.set_Visible(Boolean Prop)**

如果我不退出Word应用程序,则不会出现此错误。

下面,我向您展示我打开并退出Word应用程序的功能。

    //function to open word Document located in a specific path
        public static void openWordDocument(string fileName)
        {
            try
            {
                wordApplication.Visible = true;
                string filePath = myPath + fileName;
                WordApi.Document docx = wordApplication.Documents.Open(filePath);
            }
            catch (Exception ex)
            {
                MyLogger.Error(ex.ToString());
            }
        }



//function to quit wordApplication 
  public static void CloseWordApp() {

            try {
                Object wordAppObject = Marshal.GetActiveObject("Word.Application");
                WordApi.Application wordApp = (WordApi.Application)wordAppObject;  //cast Object to its actual type
                wordApp.Quit();
            }
            catch (Exception ex) {
                 MyLogger.Error(ex.ToString());
            }


2 个答案:

答案 0 :(得分:2)

我终于弄清楚是什么问题。 主要问题是当我退出并尝试打开另一个Word文档时,打开另一个Word文档意味着获取/创建Word应用程序的对象。在我的案例wordApp != null中,在完成应用程序的确定后,我不得不创建另一个 Word应用程序对象,并根据情况返回它。

  //open word Document located in a specific path
    public static void openWordDocument(string fileName)
    {
        try
        {
            wordApplication = createWordApplicationObject(wordApplication);
            wordApplication.Visible = true;
            string filePath = myPath + fileName;
            WordApi.Document docx = wordApplication.Documents.Open(filePath);
        }
        catch (Exception ex)
        {
            MyLogger.Error(ex.ToString());
        }
    }
private static WordApi.Application createWordApplicationObject(WordApi.Application wordApp)
    {
        WordApi.Application wordAppFirstTime;
        WordApi.Application wordApp1;
        if (wordApp == null)
        {
            wordAppFirstTime = new WordApi.Application();
            return wordAppFirstTime;

        }
        else
        {
            wordApp1 = new WordApi.Application();
            return wordApp1;
        }

    }

CloseWordApp()保持不变。

答案 1 :(得分:1)

以下一行代码很可能触发了异常:

value = []
for p in total_pageview:
    for c in total_conversion:
        if p['y'] == c['y'] and p['m'] == c['m'] and p['d'] == c['d']:
            value.append({'year':p['y'], 'month':p['m'], 'day':p['d'], 'total':(float(c['c'])/float(p['p']))*100})

您需要确保COM服务器处于活动状态。因为退出后该对象变得不可用。我建议将此类对象引用设置为null,以便稍后我们可以检查应用程序对象是否仍然存在。例如:

wordApplication.Visible = true;