Как обрабатывать исключение System.Runtime.InteropServices.COMException (0x800706BA): сервер RPC недоступен. (Исключение из 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());
            }



person Tsal Giorgos    schedule 27.06.2019    source источник
comment
Почему вы используете ROT для Word.Application, когда у вас есть прекрасное поле wordApplication? Также вы можете получить не тот экземпляр. Просто используйте это поле и выполните wordApplication.Quit(); wordApplication = null;. Я бы не стал беспокоиться об этой последней ссылке, которую вы упомянули, не понимаю, как она здесь применима.   -  person MickyD    schedule 27.06.2019
comment
Не работает. Все еще получаю точно такую ​​же ошибку. @МиккиД   -  person Tsal Giorgos    schedule 27.06.2019
comment
Подумайте о последовательности, которую вы описали в утверждении: я открываю документ Word, но когда я выхожу из него и пытаюсь открыть другой документ Word, появляется эта ошибка. Я интерпретирую вашу последовательность так, что вы пытаетесь использовать закрытое приложение Word для открытия нового документа. Кроме того, выполнение этого с экземплярами static вызывает проблемы, поскольку, если вы специально не обнулите эти экземпляры, они не имеют права на сбор и выпуск базовой ссылки COM.   -  person TnTinMn    schedule 27.06.2019
comment
Подожди, а где ты на самом деле инициализируешь wordApplication?? В одной части кода вы используете поле, а в другой — ROT. Когда вы выходите из Word, вам нужно установить wordApplication на null. Вам нужно будет воссоздать его позже, прежде чем использовать его   -  person MickyD    schedule 27.06.2019
comment
Кстати, вы можете использовать dynamic переменные с COM вместо кастинга; необходимость знать тип; или добавьте ссылки на библиотеки взаимодействия и/или COM. Однако вы не получите IntelliSense   -  person MickyD    schedule 27.06.2019


Ответы (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());
}
person Eugene Astafiev    schedule 27.06.2019
comment
Хорошо. Сначала я даже не заметил, что OP использует поля-сироты. +1 - person MickyD; 27.06.2019

Наконец-то я понял, в чем проблема. Основная проблема заключалась в том, что когда я выхожу из него и пытаюсь открыть другой документ 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() остаются прежними.

person Tsal Giorgos    schedule 03.08.2019
comment
Если вы поделитесь своим ответом на свой вопрос, это расценивается как положительный вклад в сообщество. - person Léa Gris; 03.08.2019
comment
Я надеюсь, что это поможет кому-то, когда-нибудь. - person Tsal Giorgos; 04.08.2019