LibreOffice 7.3.1 向けのLibreOffice SDK7.3.1で、CliフォルダのDllのタイムスタンプが変化していたので、新たに、プロジェクト作成し、Windows10 64bt、LibreOffice(x64)環境で、実行できるか確認を行ったが、今まで通り、LibreOffice(x64)は、C#では操作できなかった。
LibreOffice SDK7.3.2.2でも、Windows10 64bt、LibreOffice(x64)環境では、C#から、LibreOfficeは、操作できませんでした。
LibreOffice SDK7.3.1では、C#でLibreOfficeを操作したい場合、引き続き、LibreOffice(x86)版を使用する必要があります。
C#で、LibreOffice(x86)を操作する方法に関しては、「Visal Studioで、LibreOffice Calcを操作するプログラムを作成する」を参照してください。
動作確認した手順
新しいプロジェクトを作成します。
WPFアプリ(.Net Framework)テンプレートを使用します。
「OperateeLibreOfficeX64CalcTest」というプロジェクト名で、プロジェクトを作成します。
ソリューションエクスプローラー内の「参照」を右クリックして、「参照の追加」を選択します。
追加する参照は、次の6つです。
LibreOffice本体内のファイル
- cli_uno.dll
C:\Program Files\LibreOffice\program (64bit版の場合の所在)
LibreOffice SDK内のファイル
- cli_basetypes.dll
- cli_cppuhelper.dll
- cli_oootypes.dll
- cli_ure.dll
- cli_uretypes.dll
参照の履歴が、残っていれば、右クリックして「最近の参照のクリア」でクリアします。
「参照マネージャー」の左側の「参照」を選択し、追加するファイルを指定します。選択するファイルが表示されていなければ、右下の「参照」をクリックして、指定します。
LibreOffice SDK7.3.1で、タイムスタンプが新しくなったdllを使って動作を確認することが目的ため、それ以前のdllを参照して構築したプロジェクトのdllを差し替えて実行する場合、ソリューションエクスプローラーで、以前のdllの参照を削除してから、新たにdllへの参照を追加してください。
コードを入力します。内容は、以前と同じです。
<Window x:Class="OperateLibreOfficeCalcTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="100" Width="200">
<Grid>
<Button Click="Button_Click">Calcを操作する</Button>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
// LibreOffice用
using uno.util; // Bootstrap
using unoidl.com.sun.star.frame; // XComponentsLoader
using unoidl.com.sun.star.lang; // XMultiServiceFactory
using unoidl.com.sun.star.sheet; // XSpreadsheetDocument, XSpreadsheet
using unoidl.com.sun.star.table; // XCell
using unoidl.com.sun.star.uno; // XComponentContext
using unoidl.com.sun.star.beans;
using unoidl.com.sun.star.util;
namespace OperateLibreOfficeCalcTest
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
// LibreOfficeと接続する
//コンポーネントコンテキストの取得
XComponentContext context = Bootstrap.bootstrap();
//サービスマネージャの取得
XMultiServiceFactory factory =
(XMultiServiceFactory)context.getServiceManager();
//コンポーネントローダの取得
XComponentLoader loader =
(XComponentLoader)factory.createInstance("com.sun.star.frame.Desktop");
// Calcを新規に起動する
// 空のスプレッドシート文書を作成する
XComponent component = loader.loadComponentFromURL("private:factory/scalc", "_blank", 0, new unoidl.com.sun.star.beans.PropertyValue[0]);
XSpreadsheetDocument spredsheetDocument = (XSpreadsheetDocument)component;
//シートの取得 LibreOffice Calcでは、新規にブックを作成したときのシート名は、”Sheet1”です。
XSpreadsheets sheets = spredsheetDocument.getSheets();
XSpreadsheet sheet = (XSpreadsheet)sheets.getByName("Sheet1").Value;
//セルに出力
sheet.getCellByPosition(0, 0).setFormula("Hello World!");
}
}
}
プロジェクトファイル
実行結果
ボタンを持つウィンドウが表示されます。
ボタンを押すと例外が、発生します。
Sunによって構築されたOOo 3.0(OOoは、OpenOffice.orgを示す)は、32 bit Windows向けに作られていますが、64 bitでも動作します。64bit版で、CLI アプリケーションを実行するには、32 biの.Net Frameworkをインストールする必要があります。(OOo 3.0のversion 3.5)。アプリケーションは、x86プラットホーム向けに構築する必要があります。(プラットホームのcsc.exeの切り換えを参照して下さい)、それ以外の場合には、それは実行しません。anycpuやx64を使用する場合、アプリケーションは、64bit処理で読み込まれます。OOoに接続してブリッジを作成するには、この処理は、32bit DLLであるOOoから、いくつかのdllを読み込む必要があります。これは、動作しません、そして、System.BadImageFormatExceptionが、投げられます。
参考
LibreOffice SDK7.3.1で、CliフォルダのDllのタイムスタンプが変化していましたが、これまで通り、LibreOffice(x64)は、操作できないようです。今後の更新に期待です。
Libreofficeのコミュニティでの情報がありました。(2018-10)C# LibreOffice SDK
- GAC (C:\Windows\ Microsoft.NET 14 \assembly) から LibreOffice DLL を取得するには、AssemblyResolve イベントをオーバーライドする必要がありました。
- アプリケーションは同じ LibreOffice アーキテクチャがインストールされている状態で実行する必要があるため、AssemblyResolve イベントが適切な DLL を見つけられるように、32 ビットと 64 ビットの 2 つの実行可能ファイルを生成する必要がありました (「32 ビット優先」プロジェクト プロパティをオンまたはオフにします)。
- Windows レジストリにある環境変数「UNO_PATH」を設定するために、もう 1 つの変更が必要でした。