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

Posted

技术标签:

【中文标题】如何处理 System.Runtime.InteropServices.COMException (0x800706BA):RPC 服务器不可用。 (来自 HRESULT 的异常:0x800706BA)【英文标题】:How to handle System.Runtime.InteropServices.COMException (0x800706BA): The RPC server is unavailable. (Exception from HRESULT: 0x800706BA) 【发布时间】:2019-06-27 11:40:14 【问题描述】:

我正在开发一个操作 Word 应用程序的 Windows 应用程序。更具体地说,我正在打开一个 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());
            


【问题讨论】:

当你有完美的wordApplication 字段时,你为什么要为Word.Application 使用ROT?此外,您最终可能会得到错误的实例。只需使用该字段并执行wordApplication.Quit(); wordApplication = null;。我不会担心你提到的最后一个链接,在这里看不到它是如何应用的 没有用。仍然得到完全相同的错误。 @MickyD 想想你在语句中描述的顺序:“我正在打开一个 Word 文档,但是当我退出它并尝试打开另一个 Word 文档时,就会出现此错误。”我解释您的序列的方式是您尝试使用 已关闭 Word 应用程序打开一个新文档。同样对static 实例执行此操作是自找麻烦,因为除非您专门为这些实例清空,否则它们没有资格让 GC 收集和释放底层 COM 引用。 等等,你在哪里初始化wordApplication??在代码的一部分中,您使用的是一个字段,而另一部分是 ROT。退出 Word 时,需要将 wordApplication 设置为 null。您需要稍后重新创建它才能使用它 顺便说一句,你可以使用dynamic 变量与COM而不是强制转换;必须知道类型;或添加对互操作和/或 COM 库的引用。虽然你不会得到 IntelliSense 【参考方案1】:

我终于弄清楚了问题所在。 主要问题是当我退出它并尝试打开另一个 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() 保持不变。

【讨论】:

分享您对自己问题的回答是对社区的积极贡献。 我希望有一天它会对某人有所帮助。【参考方案2】:

异常很可能是由以下代码行触发的:

wordApplication.Visible = true;

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

try

    if (wordApplication == null)
    
        wordApplication = new Word.Application();
    
    wordApplication.Visible = true;
    string filePath = myPath + fileName;
    WordApi.Document docx = wordApplication.Documents.Open(filePath);

catch (Exception ex)

    MyLogger.Error(ex.ToString());

【讨论】:

好。起初我什至没有注意到 OP 正在使用孤立字段。 +1

以上是关于如何处理 System.Runtime.InteropServices.COMException (0x800706BA):RPC 服务器不可用。 (来自 HRESULT 的异常:0x800706BA的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 UsernameNotFoundException 春季安全

如何处理c#中的错误代码

Akka 如何处理消息版本?

开玩笑测试 - 如何处理 JsonWebToken 响应

如何处理 JSON 响应

“不知道如何处理' nvcc 致命错误