Domanda

Ecco un'applicazione di esempio che crea una finestra con un solo pulsante all'interno. Quando si fa clic, si connette a OOo (se non è già collegato) e crea un documento di testo.

Questo funziona bene a meno che tutti i documenti creati in OOo sono chiusi. Poi, ho un DisposedException quando si cerca di creare il grafico successivo. Questo è comprensibile, ma OOo è stato chiuso. Tuttavia, cercando di riconnettere a questo punto mi dà un segmentation fault. C'è un modo migliore per ricollegare? Sto lavorando su Linux (Ubuntu).

Nota: Questo si collega correttamente a OOo, anche se OOo non è aperto. E 'una volta che OOo è stato aperto con l'applicazione, poi chiuse che si ottiene l'errore.

Tutto ciò che ha realmente bisogno di guardare è il metodo Connect. Ho appena avvolto in un'interfaccia Gtk per un facile test.

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]); 
      } 
   } 
}
È stato utile?

Soluzione

Non sono mai stato in grado di capire questo, ma ho trovato un modo per incidere intorno ad esso:

Ho creato un eseguibile separato per fare la generazione. La mia domanda principale quindi chiama questo eseguibile, passando i parametri necessari (solo un percorso del file da generare da, e la modalità per generare in).

Poiché l'arresto avviene solo se OOo è stato chiuso dall'avvio dell'applicazione corrente (e generato almeno un grafico), questo evita l'intera questione. E 'un brutto hack, ma ottiene il lavoro fatto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top