Как выгрузить приложение из памяти

Автор Борис_С, 9 декабря 2021, 11:35

0 Пользователи и 1 гость просматривают эту тему.

Борис_С

Всем доброго дня!
Запускаю приложение OO в С# CLI в режиме отображения документа.
В конце выполняю оператор xComponent.dispose();
Смотрю диспетчер задач. Приложение выгружается из основной памяти и переходит в фоновый режим.
Мне нужно полностью выгрузить приложение. Как это сделать?
Еще более интересна ситуация, когда я запускаю приложение в невидимом режиме.
После запуска приложения его нет в диспетчере задач ни в основной памяти, ни в фоновой, хотя все операции с документом выполняются.
Что за чудеса?
Спасибо.

sokol92

#1
Никогда (даже в юном возрасте) не верил в чудеса.

Не могу запустить приложение на C#, поэтому предлагаю эквивалент на VBS. Перед запуском закрываем LO и останавливаем все фоновые процессы "LibreOffice".

Option Explicit
Sub test
 Dim oSM, StarDesktop, oDoc, args(0), retval
 Set oSM = CreateObject("com.sun.star.ServiceManager")                
 Set StarDesktop = oSm.createInstance("com.sun.star.frame.Desktop")
 
 Set args(0)=oSm.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
 args(0).Name = "Hidden"
 args(0).Value = True  

 Set oDoc=StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, args)   ' New Document
 Msgbox "Document opened"
 oDoc.close(True)               ' close document
 retval=StarDesktop.terminate   ' close Desktop
 If retval Then
  Msgbox "LibreOffice closed"
 End If
End Sub

test


При выдаче первого Msgbox можно (не отвечая) посмотреть в Диспетчере задач фоновые процессы LibreOffice - должны быть на месте!
Если второй Msgbox отработал, то фоновых процессов с указанным именем быть не должно.
Владимир.

Борис_С

Оператор

Set oDoc=StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, args)

на CLI выглядит так:

XComponent xComponent = componentLoader.loadComponentFromURL(
                    "private:factory/scalc", "_blank",
                    0, args);

Для класса com.sun.star.lang.XComponent нет метода close.
Я не понимаю, как это можно сделать на CLI.

sokol92

MRI подсказывает, что так (проверьте):
      
XCloseable xCloseable = (XCloseable) xComponent;
xCloseable.close(true);
Владимир.

Борис_С


sokol92

#5
using unoidl.com.sun.star.util;

Ищем в MRI данный метод, смотрим на столбец Declaring Class.
Владимир.

Борис_С

Спасибо. Все работает.
Вот код:
                XCloseable xCloseable = (XCloseable)xComponent;
                xCloseable.close(true);
                XDesktop xDesktop = (XDesktop)componentLoader;
                xDesktop.terminate();

По-прежнему непонятно, что происходит при запуске приложения в невидимом режиме.
После запуска приложения его нет в диспетчере задач ни в основной памяти, ни в фоновой, хотя все операции с документом выполняются.

sokol92

А вы смотрели, не закрывая первого диалога (Msgbox) из ответа #1?
В Диспетчере задач должно быть 2 фоновых процесса: "LibreOffice" и "LibreOffice Calc".
Владимир.

Борис_С


sokol92

Я в последнее время говорю через переводчиков: MRI в этой теме, gramota.ru в других темах форума, Google translator на форуме ask.libreoffice.org. Но в последних двух случаях я хотя бы умею читать...  ;D

Про Open Office точно ничего не могу сказать, у меня его нет (и не предвидится, археология не мой предмет  :)).
Владимир.

Борис_С

Ладно. Пусть это останется на их совести. Главное, что работает.

Борис_С

Пытаюсь найти эквивалент оператора

Set oSM = CreateObject("com.sun.star.ServiceManager")

на С# CLI
SDK API говорит, что метод CreateObject() есть у 2-х интерфейсов:
com::sun::star::reflection::XIdlClass::createObject()
com::sun::star::frame::XComponentRegistry::createObject()
Ни оператор

unoidl.com.sun.star.reflection.XIdlClass oSM =
                    unoidl.com.sun.star.reflection.XIdlClass.CreateObject("com.sun.star.ServiceManager");

, ни оператор

unoidl.com.sun.star.frame.XComponentRegistry oSM =
                    unoidl.com.sun.star.frame.XComponentRegistry.CreateObject("com.sun.star.ServiceManager");

C# не пропускает. Говорит, не находит метод CreateObject()

sokol92

#12
В примере из #1 функция VBS (VBA) CreateObject используется (однократно) для получения ссылки на объект ServiceManager. Это не метод UNO. Далее мы уже все строим, обращаясь к ServiceManager.
Очевидно, что и в C# (и в любом другом поддерживаемом языке) необходимо в начале получить ссылку на этот объект.  
Владимир.

Борис_С

Это я и пытаюсь сделать.
Есть SDK API для Libre Office. Как я понимаю, специального SDK API для С# UNO нет, поэтому я беру SDK API для Libre Office и к интерфейсам добавляю
unoidl.
SDK API говорит, что метод CreateObject() есть у 2-х интерфейсов:
com::sun::star::reflection::XIdlClass::createObject()
com::sun::star::frame::XComponentRegistry::createObject(),
поэтому я меняю интерфейсы на
unoidl::com::sun::star::reflection::XIdlClass::createObject()
unoidl::com::sun::star::frame::XComponentRegistry::createObject(),


mikekaganski

Цитата: sokol92 от  9 декабря 2021, 13:32
... предлагаю эквивалент на VBS. ...

Option Explicit
  ...
  Set StarDesktop = oSm.createInstance("com.sun.star.frame.Desktop")
  ...


Цитата: Борис_С от 15 декабря 2021, 13:01
Пытаюсь найти эквивалент оператора

Set oSM = CreateObject("com.sun.star.ServiceManager")

на С# CLI

CreateObject из примера Владимира вызывается в скрипте VBS. VBS - это платформа Microsoft, которая ничего про UNO IDL API не знает. И единственное что она знает - это функции, определённые в VBS. CreateObject - одна из них. Это функция VBScript, которая лезет в системный реестр, ищет там данные об объекте Automation, соответствующем переданной строке, и создаёт этот объект, загружая нужные библиотеки. А вот уже созданный объект предоставляет Вам объектную модель LibreOffice/OpenOffice. До его создания никакого UNO в программе нет.

Вы пользуетесь другим языком. В Вашем проекте другие методы получения доступа к объектной модели - вероятно, Вы просто подключили соответствующие библиотеки как зависимости к своему CLI-проекту. И  эти библиотеки будут искаться на компьютерах пользователей в зарегистрированных системных хранилищах. И найдётся только один набор: тот, который был зарегистрирован последним. Не получится у Вас выбрать, к какой из установленных программ обращаться.
С уважением,
Михаил Каганский