C# 关闭OpenOffice.org后,如何重新连接到它?

C# 关闭OpenOffice.org后,如何重新连接到它?,c#,openoffice.org,bootstrapping,uno,C#,Openoffice.org,Bootstrapping,Uno,下面是一个示例应用程序,它创建了一个内部只有一个按钮的窗口。单击时,它将连接到OOo(如果尚未连接),并创建一个文本文档 除非在OOo中创建的所有文档都已关闭,否则此操作可以正常工作。然后,在尝试创建下一个图表时,我得到一个DisposedException。这是可以理解的,但OOo已经关闭。然而,试图在这一点上重新连接给了我一个错误。有没有更好的方法重新连接?我在linux(Ubuntu)上工作 注意:即使OOo未打开,也会正确连接到OOo。一旦OOo被应用程序打开,然后关闭,我们就会得到错误

下面是一个示例应用程序,它创建了一个内部只有一个按钮的窗口。单击时,它将连接到OOo(如果尚未连接),并创建一个文本文档

除非在OOo中创建的所有文档都已关闭,否则此操作可以正常工作。然后,在尝试创建下一个图表时,我得到一个DisposedException。这是可以理解的,但OOo已经关闭。然而,试图在这一点上重新连接给了我一个错误。有没有更好的方法重新连接?我在linux(Ubuntu)上工作

注意:即使OOo未打开,也会正确连接到OOo。一旦OOo被应用程序打开,然后关闭,我们就会得到错误

您真正需要了解的是Connect方法。我只是把它包装在一个Gtk接口中,以便于测试

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]); 
      } 
   } 
}

我一直没能弄明白这一点,但我确实找到了一种绕过它的方法:

我创建了一个单独的可执行文件来进行生成。然后,我的主应用程序调用这个可执行文件,并向它传递必要的参数(只是要生成的文件的路径和生成模式)


由于崩溃仅在应用程序开始运行(并生成至少一个图表)后OOo关闭时发生,因此避免了整个问题。这是一个非常丑陋的黑客行为,但它完成了任务。

我一直无法弄清楚这一点,但我确实找到了一种绕过它的方法:

我创建了一个单独的可执行文件来进行生成。然后,我的主应用程序调用这个可执行文件,并向它传递必要的参数(只是要生成的文件的路径和生成模式)


由于崩溃仅在应用程序开始运行(并生成至少一个图表)后OOo关闭时发生,因此避免了整个问题。这是一个非常丑陋的黑客攻击,但它完成了任务。

这可能是一个愚蠢的问题,但是一旦所有文档关闭,您是否有OOo设置可以完全退出?我有(从某种意义上说,我没有使用Quickstarter或任何东西)。但是,我注意到,当我关闭文档时,不会为componentContext、multiServiceFactory或loader调用“disposed”信号。只有“文档”调用disposed信号。这可能是一个愚蠢的问题,但是一旦所有文档关闭,您是否有OOo设置可以完全退出?我有(从某种意义上说,我没有使用Quickstarter或任何东西)。但是,我注意到,当我关闭文档时,不会为componentContext、multiServiceFactory或loader调用“disposed”信号。只有“文档”调用已处理的信号。