Pregunta

Esta es una aplicación de ejemplo que crea una ventana con un solo botón en el interior. Cuando se hace clic, se conecta a OOo (si no está ya conectado) y crea un documento de texto.

Esto funciona bien a menos que todos los documentos creados en OOo están cerrados. A continuación, aparece un DisposedException al intentar crear la siguiente tabla. Esto es comprensible, pero OOo se ha cerrado. Sin embargo, tratando de volver a conectar en este momento me da un error de segmentación. ¿Hay una mejor manera de volver a conectar? Estoy trabajando en Linux (Ubuntu).

Nota: Esto conecta correctamente a OOo incluso si OOo no está abierto. Es una vez OOo ha sido abierto por la aplicación, y luego cerrada que conseguimos el error.

Todo lo que realmente necesita para tener en cuenta es el método Connect. Yo sólo lo envolvió en una interfaz GTK para la prueba fácil.

using System; 
using unoidl.com.sun.star.uno; 
using unoidl.com.sun.star.lang; 
using unoidl.com.sun.star.text; 
using unoidl.com.sun.star.frame; 
using unoidl.com.sun.star.beans; 
using Gtk; 

namespace TestOOo { 
   class MainClass { 
      static XComponentContext componentContext; 
      static XMultiServiceFactory multiServiceFactory; 
      static XComponentLoader loader; 
      static XTextDocument document; 

      public static void Main (string[] args) 
      { 
         Application.Init(); 

         Window mainWindow = new Window("Test Window"); 
         mainWindow.Visible = true; 
         mainWindow.Destroyed += delegate { Application.Quit(); }; 
         Button button = new Button(Stock.Ok); 
         button.Clicked += delegate { Connect(); }; 
         mainWindow.Add(button); 
         mainWindow.ShowAll(); 

         Application.Run(); 
      } 

      static void Connect() 
      { 
         // Connect to OOo 
         if (componentContext == null) 
            componentContext = uno.util.Bootstrap.bootstrap(); 

         try { 
            multiServiceFactory = 
               (XMultiServiceFactory) componentContext.getServiceManager(); 
         } catch { 
            // This is where we want to reconnect, but trying to 
            // bootstrap() again segfaults. 

            // componentContext = uno.util.Bootstrap.bootstrap(); 
            // multiServiceFactory = 
            //   (XMultiServiceFactory) componentContext.getServiceManager(); 
         } 

         loader = (XComponentLoader) 
            multiServiceFactory.createInstance("com.sun.star.frame.Desktop"); 
         document = (XTextDocument) loader.loadComponentFromURL 
            ("private:factory/swriter", "_blank", 0, new PropertyValue[0]); 
      } 
   } 
}
¿Fue útil?

Solución

Nunca fue capaz de resolver esto, pero se encontró una manera de cortar alrededor de ella:

He creado un ejecutable independiente para hacer el generador. Mi solicitud principal, entonces llama a este ejecutable, pasándole los parámetros necesarios (sólo una ruta de acceso al archivo a generar a partir de, y el modo de generar in).

Desde el accidente sólo se produce cuando OOo ha sido cerrada ya que la aplicación empezó a correr (y generada al menos una tabla), esto evita todo el tema. Es un corte muy feo, pero hace el trabajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top