これは、単一のボタンを内部に持つウィンドウを作成するサンプル アプリケーションです。クリックすると、OOo に接続され (まだ接続されていない場合)、テキスト ドキュメントが作成されます。
OOo で作成されたすべてのドキュメントが閉じられていない限り、これは正常に機能します。次に、次のチャートを作成しようとすると DisposedException が発生します。これは理解できますが、OOo は閉鎖されました。ただし、この時点で再接続しようとすると、segfault が発生します。再接続する良い方法はありますか? 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]);
}
}
}