这是一个示例应用程序,它创建一个内部有一个Button的Window。单击时,它将连接到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]);
}
}
}
答案 0 :(得分:1)
我从未弄清楚这一点,但我确实找到了解决问题的方法:
我创建了一个单独的可执行文件来进行生成。我的主应用程序然后调用此可执行文件,向其传递必要的参数(只是生成文件的路径,以及生成的模式)。
由于崩溃仅在应用程序开始运行(并生成至少一个图表)后关闭OOo时发生,因此可以避免整个问题。这是一个非常难看的黑客,但它完成了工作。