2021年9月12日日曜日

63: C#でUNOコンポーネントを作成する

<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>

典型的には、LibreOfficeまたはOpenOfficeクライアントにおけるリスナー、例えばディスパッチコマンド群のための、しかし、それだけではない。

話題


About: UNO (Universal Network Objects)
About: LibreOffice
About: Apache OpenOffice
About: C#

この記事の目次


開始コンテキスト



ターゲットコンテキスト



  • 読者は、自らのUNOコンポーネントをC#にて作成・利用する方法を知る。

オリエンテーション


任意のUNOインターフェイスを作成・登録し、当該マッピングイメージ群を生成する方法についての記事があります。

任意のUNOコンポーネントをJavaにて作成する方法の記事があります。

任意のUNOコンポーネントをC++にて作成する方法の記事があります。


本体

ト書き
Hypothesizer 7、Objector 63A、Objector 63Bが、コンピューターの前にいる。


1: 動機


Hypothesizer 7
UNOコンポーネントを作成しようとする根源的動機は、そのインスタンス(UNOオブジェクト)を別のプログラミング言語環境から操作できるようにすることです。

Objector 63B
ああ、それじゃあ、私には全然関係ないわ。「別のプログラミング言語環境」なんて私にはないもの。

Hypothesizer 7
えーと、あなたは、UNOプログラムを作成されているのではないのですか、マダム?

Objector 63B
. . . してると思ってたけど。

Hypothesizer 7
今はそう思われないのですか?

Objector 63B
. . . 私を引っかけようとしてるでしょう?

Hypothesizer 7
私はどなたも引っかけようとしていません。

Objector 63B
私を引っかけようとしてるわよ!思うと言うや否や、私に飛びかかるんでしょ!

Hypothesizer 7
. . . 私はどなたにも飛びかかりはしません。

Objector 63B
しない?えーと、私は、'bootstrap'してCalcシートを操作するC#プログラムを作成しようとしているのよ、もしも、それがあなたの聞いていることなら。

Hypothesizer 7
それでは、あなたは、UNOプログラムを作成されようとしていて、別のプログラミング言語環境をお持ちです、マダム。

Objector 63B
飛びかかったじゃないの!そうだと思ったわ!

Hypothesizer 7
. . . 「飛びかかった」のではありませんよ、全然。私は状況を明確にしただけです。

Objector 63B
どんな状況なの?

Hypothesizer 7
あなたのC#プログラムはあるLibreOfficeまたはApache OpenOfficeインスタンスにコネクトし、そのインスタンスは別のプログラミング言語環境です。

Objector 63B
「あるLibreOfficeまたはApache OpenOfficeインスタンス」?そんなものは持ってないけど。

Hypothesizer 7
いえ、お持ちです。あなたがなさる'bootstrap'はそれにコネクトします、もしもそれが存在しなければ1つ立ち上げたあとに。

Objector 63B
何を言ってるか分からないけど。

Hypothesizer 7
あなたは、UNOがどのように動作するかを理解するべきです。

Objector 63B
. . . どっちみち、「別のプログラミング言語環境」で私はプログラミングなんかしないわよ。

Hypothesizer 7
そういう問題ではありません、マダム。

Objector 63A
私は、別のプログラミング言語環境があることを知っているが、自分のUNOコンポーネントを作る必要はない。

Hypothesizer 7
えーと、間違いありませんか、サー?

Objector 63A
私の目的は、Writerかなんかのドキュメントかなんかといういくつかの既存UNOコンポーネントを操作することだ。なんで、私が私自身のUNOコンポーネントなど作りたがるんだ?

Hypothesizer 7
典型的なケースは、リスナーを作成されるというものです。

Objector 63A
「リスナー」?

Hypothesizer 7
ブロードキャスターーリスナーパターンはLibreOfficeまたはApache OpenOfficeではかなりよく見られるものなので、UNOプログラミングをある程度やれば、それに大抵ぶつかることになります。

Objector 63A
. . .

Hypothesizer 7
典型的な例は、UNOディスパッチコマンドを実行する場合です。

Objector 63A
それが何だ?リスナーなどなくともUNOディスパッチコマンドを実行できる。

Hypothesizer 7
おできになります、怠惰な方法では、しかし、リスナーをお使いになれば、実行から入手可能な情報の全体を取得することができます

Objector 63A
. . . それじゃあ、リスナーが、UNOコンポーネントを作成する唯一の機会だな . . .

Hypothesizer 7
必ずしもそうではありません。あなたのUNOオブジェクトをマクロかなんかに渡すこともできますし、あなたのUNOコンポーネントたちが中で生存するC# UNOサーバーを作成することさえできます。

Objector 63A
. . . 何を言っているのか分からんな。

Hypothesizer 7
一部の人々はお分かりになるかもしれません。


2: 準備


Hypothesizer 7
もしも、あなたのUNOコンポーネントはいくつかのご自身のUNOインターフェイスを実装するというのであれば、それらを作成済みでそれらのC#マッピングイメージを生成済みでなければなりません、以前の記事にしたがって。

Objector 63B
「UNO インターフェイス」?

Hypothesizer 7
もしもそれらを必要とされていないのでしたら、それについて心配なさる必要はありません。


3: UNOコンポーネントを作成する


Hypothesizer 7
以下は、UNOコンポーネントを作成する典型的なコードです。

@C# ソースコード
namespace theBiasPlanet {
	namespace unoUtilitiesTests {
		namespace localUnoObjectsTest1 {
			using System;
			using uno.util;
			using unoidl.com.sun.star.lang;
			
			public class TestUnoComponent: WeakBase, XUnoTunnel {
				public TestUnoComponent () {
				}
				
				~TestUnoComponent () {
				}
				
				public virtual Int64 getSomething (Byte [] a_datumIdentification) {
					return 0;
				}
			}
		}
	}
}

Objector 63B
. . . それって、私のUNOコンポーネントは「WeakBase」と「XUnoTunnel」を拡張しないといけないってこと、常に?

Hypothesizer 7
いいえ。'uno.util.WeakBase'はヘルパークラスであり、既にいくつかのUNOインターフェイス(具体的には、'unoidl.com.sun.star.uno.XWeak'および'unoidl.com.sun.star.lang.XTypeProvider')を実装してあります、もしも、あなたのUNOコンポーネントはそれらのUNOインターフェイスを実装する必要ないというのであれば、それは'WeakBase'を拡張する必要はありません。

Objector 63B
「もしも」と言われても . . .

Hypothesizer 7
'XWeak'は、それのインスタンスがウィークにポイントされることができるようにするためのものです。

Objector 63B
「ウィークにポイントされる」?

Hypothesizer 7
ある以前の記事にて詳説されたとおり、'ウィークにポイントされる'というのは、インスタンスの使用カウントが、そのインスタンスが実際にアクセスされる直前にインクリメントされ、そのアクセスが完了した直後にデクリメントされることを意味します。

Objector 63B
. . .

Hypothesizer 7
. . . ですが、もしも、それをご理解されないのでしたら、それは、多分、あなたはそれを必要とされていないからでしょう。

他方、'XTypeProvider'は、それをマクロ言語たちからアクセス可能にするためのものです。

Objector 63B
私は特にそれがマクロ言語からアクセスされると想定していないけど、アクセス可能にして何の害もないんでしょう?

Hypothesizer 7
ありません。

Objector 63B
オーケー。

Hypothesizer 7
「XUnoTunnel」について言えば、それは、単に、害のない例として挙げられているだけであって、通常は、あなたはそれを使用する必要はないでしょう。

あなたのUNOコンポーネントは、それの代わりに、あなたの必要なUNOインターフェイス(複数可能)を拡張すればよいのです。

Objector 63B
私の必要なUNOインターフェイスは何?

Hypothesizer 7
あなたのUNOコンポーネントが何を必要としているかを私は存じません。 . . . もしも、あなたのUNOコンポーネントがリスナーであれば、対応するブロードキャスターが要求するものが、あなたのUNOコンポーネントが必要とするものです。


4: 利用方法


Hypothesizer 7
当該UNOコンポーネントを含んでいるアセンブリファイルは、勿論、あなたのプログラミングから参照されなければなりません。

Objector 63B
それはどうすれば参照されることができるの?

Hypothesizer 7
それは、純粋にC#の問題です: それは、全く普通の.NETアセンブリが参照されるように参照されることができます。

とにかく、当該UNOコンポーネントのインスタンスをそのC# 環境内に作成するには、そのクラスのコンストラクタをコールすればよいだけです。

Objector 63B
それから?

Hypothesizer 7
「それから」とはどういう意味でしょうか?

Objector 63B
そのインスタンスをどう使えばいいの?

Hypothesizer 7
そのC#環境内でそれを普通のC#オブジェクトとしてお使いになれます。

Objector 63B
それって意味ある?それって、ただの普通のC#オブジェクトじゃん!

Hypothesizer 7
それが意味あるのは、それはブロードキャスターへ渡せるからです、例えば。

Objector 63B
ふーむ。

Hypothesizer 7
もしも、そのUNOオブジェクトを別の環境から操作されるのであれば、もちろん、あなたは、それを、それがリモートUNOオブジェクトであるものとして操作しなければならないでしょう。

Objector 63B
そのUNOコンポーネントクラスは、別の環境からどのように参照されるようにすればいいの?

Hypothesizer 7
それクラスは、別の環境から参照されはしません。

Objector 63B
はあ?あなた正気じゃないんじゃない?されないといけないでしょう?

Hypothesizer 7
いいえ。別の環境は、例えば、Java環境であり、それは、勿論、そのC#クラスを参照できません。

Objector 63B
できない?

Hypothesizer 7
どうやって、Java環境がC#クラスを参照できるのでしょうか?

Objector 63B
UNOが何とかするんでしょう?

Hypothesizer 7
UNOは、UNOプロキシを用いて環境間オブジェクトアクセスを可能にするのであって、C#クラスがJava環境から参照されうるようにはしません。 . . . UNOがどのように機能するかをご理解される必要があります。


参考資料


<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>

pinit.js">