例えば、ファイルコンバージョンサーバーとして。それは、とても簡単ですが、いくつか秘訣があります。
話題
About: UNO (Universal Network Objects)
About: LibreOffice
About: Apache OpenOffice
About: C#
この記事の目次
- 開始コンテキスト
- ターゲットコンテキスト
- オリエンテーション
- 本体
- 1: オフィスWindowsサービスがするべきこと
- 2: オフィスWindowsサービスを取得してビルドする
- 3: Windowsサービスを登録する
- 4: コードの若干の説明
- 5: 結びとその先
開始コンテキスト
- 読者は、C#プログラミングの基本的知識を持っている。
- 読者は、Windowsサービスを作成する方法の知識を持っている。
- 読者は、UNOとは何か、UNOはLibreOfficeまたはApache OpenOfficeとどう関係しているかの知識を持っている。
- 読者は、LibreOfficeまたはApache OpenOfficeのインスタンスをUNOサーバーにする方法の知識を持っている。
- 読者は、C#コンソールUNOクライアントを作成する方法の知識を持っている。
ターゲットコンテキスト
- 読者は、C#によるLibreOfficeまたはApache OpenOfficeのWindowsサービスを入手し、そうしたWindowsサービスを作成する方法を知る。
Hypothesizer 7、Objector 26A、Objector 26Bがコンピューターの前にいる。
オリエンテーション
Hypothesizer 7
本記事では、C#によるLibreOfficeまたはApache OpenOfficeのWindowsサービスのサンプルを入手し、そうしたWindowsサービスを作成する方法を知ります。
Objector 26A
それはいい。それは使えるね。実のところ、私は、Windowsサービスを1つも作ったことがない。
Hypothesizer 7
ああ、サー、実のところ、Windowsサービスを作成するのはとても簡単です、IDEを使っても、IDEを使わなくても。
Objector 26A
...えーと、Windowsサービスを作りさえすれば、あとはただ、Windowsサービス内で、オフィスプログラムを起動してそのプロセスを殺すだけだろう?
Hypothesizer 7
一部のユースケースではそれも許容できるかもしれませんが、何らかのファイルに書き込みをしているかもしれないプロセスを残忍に殺すのは、あまり望ましくはないでしょう。それに、ある措置を取らないと、'soffice --convert-to'のようなコマンドがオフィスインスタンスをシャットダウンしてしまいます。
Objector 26A
えーと...
Objector 26B
オフィスWindowsサービスは、別のプログラミング言語でも作れるんでしょう?
Hypothesizer 7
マダム、その通りです。使われるのはCLRなので、他のどの.NET Frameworkプログラミング言語(Visual Basic.NETまたはC++/CLIが人気のある選択肢でしょうし、F#も使えるようです)でもできるはずです。C++(アンマネージド)も使えますが、多分、はるかに多くのコードが必要になるでしょう(実のところ、私はかつて、Win32 APIを用いてC++ Windowsサービスを作成しました)。Javaですか?よく知りませんが、ピュアJavaではできないでしょう。
本体
1: オフィスWindowsサービスがするべきこと
Hypothesizer 7
オフィスWindowsサービスが何をすべきかは、以前の記事のあるセクションで既に説明しておりますので、そちらをご参照ください。
Objector 26A
...それでは、オフィスWindowsサービスはオフィスインスタンスを起動し、それから、そのオフィスインスタンスへのUNOクライアントになると?
Hypothesizer 7
はい、それが、コンソールC# UNOクライアントを作成する方法をご存知でなければならない理由です。
2: オフィスWindowsサービスを取得してビルドする
Hypothesizer 7
ここにオフィスWindowsサービスがあります。
'officeWindowsService'が、オフィスWindowsサービスプログラムのプロジェクトディレクトリです。他の2つのディレクトリはプロジェクト群で共用されるプロジェクトのものです('coreUtilitiesToBeDisclosed'には、あらゆる種類のプロジェクトで共用されるように想定されているユーティリティコードが含まれています。'unoUtilitiesToBeDisclosed'には、UNOプログラムのプロジェクト群で共用されるように想定されているユーティリティコードが含まれています)。
本シリーズの任意のサンプルプロジェクトをビルドする方法は、ある以前の記事に記述されています。
3: Windowsサービスを登録する
Hypothesizer 7
オフィスWindowsサービスをテストしましょう、オフィスWindowsサービスプログラムをターミナル上で実行することによって。ご注意いただきたいのですが、テストなどパスしたいと思うかもしれませんが、これは、使用されるライブラリ群をオフィスWindowsサービスプログラムディレクトリへコピーするために必要です。
準備として、'URE_BOOTSTRAP'というシステム環境変数をLibreOfficeまたはApache OpenOfficeの'fundamental.ini'ファイルのURL(例えば、'file:///D:/libreOffice/program/fundamentalrc.ini')にセットしなければなりません。
また、オフィスポートを、ある以前の記事に記述されているようにオープンしなければなりません、勿論。
以下が、テスト実行コマンドです、カレントディレクトリをオフィスWindowsサービスプロジェクトディレクトリに位置させ、オフィスディレクトリパスおよびポート番号を環境に合わせて。
@cmd ソースコード
gradle i_executeCsharpExecutableFileTask -Pc_commandLineArguments="%the office directory path%\program socket,host=localhost,port=%the port number%,tcpNoDelay=1;urp;StarOffice.ComponentContext"
もしも、'### Press any key to stop this Windows service.'というメッセージが表示されたら、プログラムは正常に起動したはずです。もしも、プログラムがあるキーを押した後にエラーなしに停止したら、プログラムは正常に終了したはずです。
そうしたら、Windowsサービスを登録するために、以下のようなコマンドを実行します、複数の'%~%'を実際の値で置換して。
@cmd ソースコード
sc create OfficeWindowsService start=demand binpath="%the development directory path%\officeWindowsService\target\theBiasPlanet.officeWindowsService.cs.exe% %the office directory path%\program socket,host=localhost,port=%the port number%,tcpNoDelay=1;urp;StarOffice.ComponentContext" obj=%the computer name%\%the operating system user name% password=%the operating system user password%
4: コードの若干の説明
Hypothesizer 7
コードの入念な説明は必要ないと思いますが、コードを読むための若干のガイダンスを提示しましょう。
'theBiasPlanet.coreUtilities.processesHandling.ProcessHandler.execute (String a_workingDirectoryPath, List <String> a_commandAndArguments, bool a_waitsUntilFinish)'というメソッド('theBiasPlanet\officeWindowsService\programs\OfficeWindowsService.cs'で呼ばれている)は、私のユーティリティメソッドであり、外部プロセスを同期または非同期に起動します(最後尾引数が'false'の場合に非同期)。
オフィスインスタンスへの接続は、以前の記事にしたがって行なわれます。
オフィスインスタンスの制御は、'unoUtilitiesToBeDisclosed'プロジェクト内にある'theBiasPlanet.unoUtilities.officeInstancesHandling.OfficeInstance'クラスによって行なわれます。
Objector 26A
ふーむ...、そのクラスはあなたの以前の記事が示唆する通りにやってるね、確かに。
5: 結びとその先
Hypothesizer 7
これで、C#によるLibreOfficeまたはApache OpenOfficeのWindowsサービスを取得し、そうしたWindowsサービスを作成する方法を知りました。
実のところ、そのWindowsサービスは、これまでに獲得してきたいくらかの知識(オフィスインスタンスをUNOサーバーにする方法、コンソールC# UNOクライアントを作成する方法、C#によるWindowsサービスを作成する方法)に、オフィスインスタンスをある程度コントロールするというほんの少しの事を加えた成果です。
そのオフィスWindowsサービスは、LibreOfficeまたはApache OpenOfficeのある種の使用法のためのとても有用なツールです、ファイルコンバータとして使用するといったような使用法の。
LibreOfficeまたはApache OpenOfficeをファイルコンバーターとして最適に使用する方法についての記事がいくらかあり(コンセプト、あるJava実装、あるC++実装、あるC#実装、あるPython実装、あるLibreOffice Basic実装)、パスワードで暗号化するためのドキュメント格納フィルタープロパティ群についての記事があります(他のいくつかのドキュメント格納フィルタープロパティ群(PDFドキュメント格納フィルタープロパティ群、CSVドキュメント格納フィルタープロパティ群、PGP暗号化のためのドキュメント格納フィルタープロパティ群、等)についての記事は以後、公開されます)。