Использую библиотеки 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:12IDisposable– aepot Aug 11 '20 at 17:19SuppressFinalizeнадоWaitForPendingFinalizers, но все равно это выглядит как костыль, чтобы заткнуть какую-то ошибку в коде. – aepot Aug 12 '20 at 05:25WaitForPendingFinalizersпробывали - не помогло, в некоторых примерах видели, по работе с либрой, что используют именно егоSuppressFinalize– Alex Solomon Aug 12 '20 at 05:28