繁体   English   中英

如何处理 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)

我正在开发一个 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());
            }


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

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

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());
}

我想添加一个适合我的解决方案。 我们在 .net web 服务中遇到了这个问题,以及其他错误,例如 Word.Documents.Open() 上的“远程过程调用失败”。 我将列出我们尝试过的所有事情,并以解决方案结束。 我们尝试了:

  • 确保 RPC 服务已启动。 Word 没有损坏,可以正常打开,包括我们打开的文件。
  • 重新启动托管 web 应用程序的服务器和服务。
  • 回滚在停止工作的同一天发生的 windows 更新。
  • 卸载了杀毒软件。
  • 我们将代码隔离到第三方应用程序以验证它是导致问题的 open() 方法,并且还使用了不同的文件。 我们创建了一个 win form 应用程序和一个 consol 应用程序。 我们以 win admin、普通帐户以及运行 web 应用程序的帐户运行该小应用程序。
  • 我们运行了 procMon。
  • 我们对word进行了修复。
  • 我们全部安装了 Office,我们尝试了 32 位和 64 位版本

最终解决方案:我们删除了运行 web 应用程序的用户配置文件。

4天就知道了。 我以为我会与世界分享我的痛苦。 哈哈

在发布这些行时,我们不确定为什么本地配置文件会创建此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM