0

Использую библиотеки LiberOffice для создания и работы с документом (Замена текста), все работает, но при окончании работ в процессах остаются висеть два процесса Либры, а именно: soffice.exe и soffice.bin.

  • Их расположение: C:\Program Files\LibreOffice\program

Проблема заключается в том, что когда эти процессы висят - не получается открыть оснастку (саму либру), начинает мигать(Появляться/исчезать 3 раза в секунду) баннер запуска LiberOffice. Но если процессы явно выключить(убить) то Либра спокойно запускается. Аналогична обратная вторая проблема, когда на устройстве включен LiberOffice - программная функция по работе с документами LiberOffice не срабатывает.

введите сюда описание изображения

Пример кода, подключение:

private XMultiServiceFactory connect()
    {
        var componentContext = uno.util.Bootstrap.bootstrap();
        return (XMultiServiceFactory) componentContext.getServiceManager();
    }

Получить документ по адресу:

private unoidl.com.sun.star.text.XTextDocument initDocumentCreate(unoidl.com.sun.star.lang.XMultiServiceFactory factory)
    {
        try
        {
            XComponentLoader loader = (XComponentLoader)
                factory.createInstance("com.sun.star.frame.Desktop");
        var urlPath = "Тут урл до файла odt";

        XComponent component = loader.loadComponentFromURL(
            urlPath, "_default", 0,
            new unoidl.com.sun.star.beans.PropertyValue[0]);

        return (unoidl.com.sun.star.text.XTextDocument) component;
    }
    catch {
        throw new System.Exception("Сообщение об ошибке");
    }

}

Работа с документом:

{
        try
        {
            var factory = connect();
            var document = initDocument(factory);
            /*Код-код-код*/
            CloseLibraProc(document);
            /*Код-код-код*/
            return doc;
        }
        catch (System.Exception e)
        {
            throw;
        }
        finally 
        {
            GC.Collect();
            GC.SuppressFinalize(this);
        }
    }

Вот так обрабатываю закрытие:

private void CloseLibraProc(unoidl.com.sun.star.text.XTextDocument document)
    {
        try
        {
            var store = (XStorable) document;
            store.store();
        var close = (unoidl.com.sun.star.util.XCloseable) document;

        if (close != null )
            close.close(false);
        else
        {
            var component = (XComponent) document;
            component.dispose();
        }
    }
    catch
    {
        throw new System.Exception("Ошибка при закрытии или сохранении");
    }
}

Возможно функция закрытия не совсем корректная и чего-то не хватает?

  • SuppressFinalize(this) а это зачем? Такая штука может быть только внутри метода Dispose() при реализации IDisposable интерфейса. Код с использованием var не могу прочесть. Можете исправить на явные типы? – aepot Aug 11 '20 at 17:12
  • @aepot GC.Collect() и GC.SuppressFinalize(this) собирает мусор, без него последовательное включение функции не работает, так как пишет что документ уже открыт – Alex Solomon Aug 12 '20 at 04:26
  • Тогда вместо SuppressFinalize надо WaitForPendingFinalizers, но все равно это выглядит как костыль, чтобы заткнуть какую-то ошибку в коде. – aepot Aug 12 '20 at 05:25
  • @aepot WaitForPendingFinalizers пробывали - не помогло, в некоторых примерах видели, по работе с либрой, что используют именно его SuppressFinalize – Alex Solomon Aug 12 '20 at 05:28
  • Оно ничего не делает, только сообщает сборщику о том, что не надо вызывать финализатор текущего объекта, когда объект будет собираться. Разберитесь, как это работает. Вот пример, который может помочь разобраться со сборщиком. – aepot Aug 12 '20 at 06:12
  • А вообще, ваш вопрос не понятен, 4 неизвестно как взаимодействующих куска кода. Нужен воспроизводимый пример, чтобы я или кто-то другой мог взять ваш код и протестировать. Сейчас ваш код опубликован в таком состоянии, что он даже не скомпилируется. Что за библиотеку для интеграции с офисом используете, где ее взять? Или вы расчитываете получить помощь от тех, кто использует либру? Так вот, здесь скорее всего таких нет, поэтому лучше оформите вопрос в соответствии с этим обстоятельством. – aepot Aug 12 '20 at 06:35

0 Answers0