Libre Officeは、他のアプリケーションから操作できる仕組みが用意されています。そのため、C#から操作することができます。
C#でLibre Officeを扱う仕組みは「Common Language Infrastructure (CLI) 」と呼ばれています。
「Common Language Infrastructure (CLI) 」を使用するためには、SDKをインストールする必要があります。
型のマッピング
原文「Type Mapping」
CLI言語結合は、オフィスに接続し、CLIに対応した言語で記述されたプログラムを実行することを目的とします。この理由から、すべてのUNO型をCLI型にマッピングする必要があります。しかしながら、あなたは、UNO(バイナリのUNO)から任意のCLIプログラム(UNOコンポーネントでない)で実行するつもりなので、すべてのCLIタイプに、マッピングを持たせる必要はありません。私たちは、UNOコンポーネントとの対話に関して焦点を当てるため、私たちは、マッピングをUNO型に制限します。他のマッピングは、後の段階で導入される場合があります。(例として、System.Decimal、インデクサーなど)。
このドキュメントでは、UNO型とCLIの完全なマッピングについてのみ説明します。
UNO型は、共通の型システム(CTS)から、型にマッピングされます。いくつかの型は、CLSに対応していませんが、(例えば、符号のない型が使われます)、それらは、さまざまなCLI開発言語から、使用できる必要があります。このドキュメントは、可能であれば、フレームワーク・クラス・ライブラリからそれぞれのクラスで、CTS型を表します。.NET言語は、これらのクラスを意図して使用する、特定の組み込みの型を提供する場合があります。例えば、C#では、あなたは、System.Int32ではなく、整数型を使用することができます。
この型のマッピング仕様は、CLI全体を対象としているため、ILアセンブラ・コードとして、マッピングを与えることができます。しかしながら、理解を容易にするために、マッピングは、大部分が、C#の例によって説明されています。
メタデータは、ILアセンブラ構文で提供されています。
この文書は、UNO型が、どのように特定の言語で定義されるかという話題に言及します。この話題は、同じように、仮定と考えるべきです。UNOのランタイムの現在の実装では、言語結合で、新しい型を導入できません。例えば、C#やJavaで記述されるコンポーネントには、UNOシステム全体で使用する必要がある新しい型が含まれている事があります。例えば、それらを、中心的なtypes.rdbに結合することによって、現在、新しい型は、Unoに知らせる必要があるidlcコンパイラのバイナリ出力として、提供する必要があります。リモートの筋書きでは、それらの型バイナリは、すべての関与している処理に存在する必要があります。
型名の修飾
IDL型の名前は、特定の言語の型名で、潜在的に競合する可能性があります。あるいは、ある言語の名前を、別の言語で使用することもできます。これらの場合では、それらの言語環境間の対話では、エラーが発生しやすい傾向があります。なぜなら、型が誤って解釈され、誤って処理されます。問題に対処するために、ブリッジは、すべてのインポートされた、エクスポートされた型名を装飾します。例えば、型a.b.cは、ある環境から、.NET環境に移動されます。続いて、ブリッジは、文字列を名前を前に置きます。そのため、名前は、unoidl.a.b.cです。その型が、やってきた環境に戻されるとき、続いて、ブリッジは、「unoidl.」接頭辞を削除します。同様に、 CLI環境を環境の外に移動する型が、定義される場合、名前には「cli」という接頭辞が付きます。戻る際は、接頭辞は、もう一度削除されます。詳細は、「UNOのコンセプト文書の名前」を参照してください。それは、以下で見つかります:
CLI型が宣言されるとき、それらの名前は、「unoidl」から始めてはいけません。UNOIDLで宣言された型は "cli"で始めてはいけません。
型のマッピング
原文「Type Mappings」
単純な型
Simple Types
単純な型は、次の表に従ってマッピングされています。
UNOIDL 型 | CLI Framework クラス(名前空間 System) |
---|---|
boolean | Boolean |
byte | Byte |
short | Int16 |
long | Int32 |
hyper | Int64 |
unsigned short | UInt16 |
unsigned long | UInt32 |
unsigned hyper | UInt64 |
float | float |
double | Double |
char | Char |
string | String |
type | Type |
void 1 | Void 2 |
- 型宣言では、voidだけが、戻り型として使用されます。
- UNOs com.sun.star.uno.TypeClassと同様に、voidのため値が含まれていませんが、System.TypeCode列挙体が存在します。
any
any型は、uno.Anyの名前で値型にマッピングされています。例えば、
//UNOIDL
void func([in]any val);
//C#
virtual void func(uno.Any val);
けれども、System.Objectは、すべての型を表現することができますが、次の理由のため、それを使わないに決定されました。:
まず、UNOのみでは、インターフェイスは、C#ではnull参照、あるいは、C++ではnullポインターに相当する値を持つことができません。anyは、すべてのuno型を表すことができ、さらに、void状態を知ることができます。(com::sun::star::uno::TypeClass_VOID) anyが、System.Objectにマッピングされている場合、続いて、CLIのnull参照は、null値とvoid anyの両方を持つインターフェイスを表します。この違いは重要です。
次に、anyは、特定のインターフェイスを含めることができます。anyの利用者は、提供された型情報のため、どんな型が含まれているか、正確に知っています。そして、キャストを用いて種類を決定するために節約されます。
型クラスが、TypeClass_VOIDの場合、言い換えると、anyが、値を持ち運ぶ場合、関数hasValueは、決定します。また、Anyクラスは、System.Objectから、Equals、ToStringとGetHashCodeメソッドを上書きします。引数として、Anyを取得する、Equalsの実装もあります。このため、引数は、上書きされたEqualsメソッドのように、アンボクシングを必要としません。anyは、多くのコンストラクタを提供します。完全な初期化を行うには、System.TypeとSystem.Objectが必要です。:
public Any(System.Type type, System.Object)
なぜなら、オブジェクトの型は、Object.GetTypeによって識別することができます。それは、この場合、型を指定する必要はありません。その結果、また、引数としてオブジェクトだけを取る、2つのコンストラクタがあります。例えば、
public Any(char value)
public Any(bool value)
しかしながら、構造体は、派生しており、そして、インターフェイスの実装は、複数のインタフェースから派生することができるため、UNOインターフェイスや構造体が、Anyに配置されるとき、続いて、型が、明確に与えられます。そして、Object.GetTypeは、意図した型を返さない場合があります。
ここで重要な点は、現在、Anyコンストラクタで、uno.PolymorphicTypeを提供する必要があるため、多型構造体は、特に言及する必要があります。:
//C#
PolymorphicType t = PolymorphicType.GetType(
typeof(unoidl.com.sun.star.beans.Optional),
"unoidl.com.sun.star.beans.Optional");
Any a = new Any(t, objStruct);
Anyには、void Anyが必要なときはいつでも使用できる、静的メンバーVOIDが含まれています。:
//C#
obj.functionWithVoidAnyArgument(uno.Any.VOID);
Anyに含まれる型と値は、TypeとValueという名前の読取専用プロパティでアクセスすることができます。また、1つは、その後、setValueを呼び出すことによって、新しい値を割り当てることができます。配列を処理するとき、これは役に立つことがあります。例えば、
//C#
uno.Any[] ar = new uno.Any[1000];
foreach(uno.Any a in ar)
a.setValue(typeof(char), 's');
また、1つは、新しいAnyインスタンスを構築し、割り当てることができます。:
foreach(uno.Any a in ar)
a = new uno.Any('c');
TypeプロパティへのsetValueと読み込みアクセスは、インスタンスの状態を変更する場合があります。その結果、1つは、並列のアクセスが、同期することを確認する必要があります。Anyが、既定で構築されるとき、例えば、配列のAnysを作成するとき、そして、Anyの型を表すメンバーは、nullです。Typeプロパティだけが呼び出され、そして、setValueが、まだ、呼び出されていないとき、そして、型は、voidに設定されます。メンバーのこの設定は、setValueに干渉する可能性があります。このため、同期が必要です。しかしながら、ほとんどの場合、同期は必要ありません。
uno.Anyは、cli_basetypes.dllに含まれています。そして、C#ソース・ファイルは、cli_ureプロジェクトで見つかります。(cli_ure/source/basetypes/uno/Any.cs).
インターフェイス
interface
全般
General
UNOIDLインターフェイス型は、パブリック・アクセシビリティでCTSインターフェイス型にマッピングします。UNOインターフェイスが、インターフェイスを継承する場合、そして、うまくに、対象とするインターフェイスも動作します。
メソッド
Methods
全般
General
すべてのメソッドは、パブリック・アクセシビリティを持っています。ターゲット型のメソッド名と引数名は、UNOIDL宣言のそれぞれの名前と同じです。戻り型と引数型は、それぞれのUNOIDL型をマッピングすることに対応します。引数の順序は、UNOIDLで宣言と同じです。
CLI言語で宣言された型は、メソッドに引数名を指定する必要はありません。それらの型だけを必要します。名前が、提供される場合、続いて、これは、すべての引数のために行います。
例外、それは、UNOIDLで、raisedキーワードで表現されます。ターゲット型との関係を持っていません。ILアセンブラ・メソッド・ヘッドは、例外を反映しません。しかしながら、利用可能なUNO例外に関する情報を持っているメタデータが、利用できます。
パラメータ型(in,out,in/out)
Parameter Types (in,out,in/out)
CLIは、3種類のパラメータ型をサポートします。:by-refパラメータ、by-valueパラメータとtyped-referenceパラメータ。typed-referenceパラメータは、極めて特別な型で、この仕様には関係ありません。(詳細は、クラスSystem.TypedReferenceを確認して下さい)。CLR内では、オブジェクトは、常に参照として渡されます。しかしながら、オブジェクトは、型名で、新しい値を割り当てることができる'&'を追跡することを示している、by-ref型だけを持っています。その結果、by-refパラメータは、in / outや単にoutパラメータとして使用できます。パラメータは、in属性、out属性(CLI:InAttribute、OutAttribute)あるいは、両方を持っています。それらは、さまざまな方法で作成されます。:
- C#のoutのような、言語固有のキーワードを使用することで、OutAttributeを作成します。
- System.Runtime.InteropServices.InAttributeとSystem.Runtime.InteropServices.OutAttributeのような、属性クラスを利用することで、
- System.Reflection.Emitフレームワークで動的なコード作成の間、パラメータを明確に定義することによって(メソッドSystem.Reflection.Emit.MethodBuilder.DefineParameterを確認して下さい)
パラメータ型は、次のようにマッピングされています。:
UNOIDLキーワード | CILパラメータの受け渡し規則 | CILカスタム属性 |
---|---|---|
[in] | by-value | InAttribute |
[out] | by-ref | OutAttribute |
[inout] | by-ref | InAttribute, OutAttribute |
メタデータでは、"by-value"型は、CLIの組み込み型やクラス名で表されます。"by-ref"型は、さらに、添付される'&'を持っています。 InAttributeは "[in]"で、OutAttributeは "[out]"で表されます。両方の属性が適用される場合、続いて、両方の目印の組合せが、メタデータに表示されます。例えば、
.method public hidebysig newslot virtual abstract
instance int16 func1([in] int16 'value') cil managed
{
}
.method public hidebysig newslot virtual abstract
instance int16 func2([out] int16& 'value') cil managed
{
}
.method public hidebysig newslot virtual abstract
instance int16 func3([out][in] int16& 'value') cil managed
{
}
サポートされているパラメータを渡す方法は、言語に依存します。言語は、また、規則を渡すための特定のパラメータを使用するためのパラメータを指定するために、専用のキーワードによる特別な構文が必要な場合があります。その結果、一般的な例を提供することはできません。しかしながら、ここに、C#とC++の例があります。:
//UNOIDL
void foo1([in] short value);
void foo2([out] short value);
void foo3([inout] short value);
// C#
void foo1( short value);
void foo2( out short value);
void foo3( ref short value);
// C++ .NET
void foo( short value);
void foo2( short *value);
void foo3( short *value);
さまざまなパラメータの受け渡しをサポートしていない言語で、UNO型の1つを使用する場合、そして、その言語は、UNOコードのプログラミングには適していない可能性があります。例えば、JScript .NETは、outパラメータをサポートしていません。その結果、それは、ほとんどのUNOアプリケーションには、不適切です。
//C++ .NET
void foo(const Foo& value);
inパラメータについての単語。UNOIDLのinパラメータが、メソッド内で、変更されない場合があります。これは、C ++では、const修飾子を使って表現できます。例えば、
しかしながら、const修飾子は、CLIでサポートされていません。そして、同じ言語で書かれたコードでだけ意味を持ちます。例えば、 C++コンパイラは、同じコンパイラによって評価される属性を作成します。しかし、他のコンパイラが、この属性を使用するかは保証されていません。例えば、
//C++ .NET
void func(const Foo* a);
// IL asm .method public hidebysig newslot virtual abstract instance void func(class Foo
modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier) a) cil managed
C#コンパイラは、IsConstModifier属性を評価しないため、引数は、その関数のC#実装で、修正することができます。
コンパイラは、InAttributeを評価し、引数を変更し妨げることができます。それは、必要ないため、inパラメータは、使用する言語に応じて修正することができます。その結果、すべての開発者は、規則に準拠する必要があります。:
UNOIDLのinパラメータは、たとえ言語によって可能にされるとしても、メソッド内から変更することができない場合があります。
例外
Exceptions
CLIメソッドが、例外を投げる場合、特にマークされていません。UNOインターフェイス・メソッドで、放り投げられる例外の情報を失わないために、ユーザー定義した属性が、そのメソッドに適用される場合があります。すべての例外は、uno.ExceptionAttributeという名前のユーザー定義した属性にマッピングされた、UNOIDLインタフェースの記述で挙げられたキーワードで、示されます。CLI言語で、新しい型を宣言したとき、1つは、この属性だけを使用する必要があります。それ以外の場合には、情報提供のみを目的としています。cli言語結合から、climakerツールは、投げる(com.sun.star.uno.RuntimeException以外の)例外が、この属性でタグを付けるメソッドでアセンブリを提供します。メソッドに属性が存在しない場合、まだ、RuntimeExceptionを投げる、あるいは、他の例外が、それから派生します。
一方向のメソッド
One-Way Methods
UNOIDLのoneway属性には、CLIに対応する物がありません。この情報を保持するために、ユーザー定義した属性uno.OnewayAttributeが適用されます。
属性
Attributes
UNOIDLの属性型は、CTSプロパティにマッピングされます。プロパティの型は、UNOIDLの属性宣言で使用される型のマッピングです。
UNOIDLの読み取り専用の属性は、読取専用プロパティにマッピングされます。つまり、プロパティは、getメソッドだけを持っています。
UNOIDLメソッドの属性は、例外を投げることができます。これらは、get、および/あるいは、setメソッドに適用される、ユーザー定義した属性uno.ExceptionAttributeによって表現されています。UNOIDLで、例外が指定されている場合、それは、適用されるだけでしょう。
XInterface
CLI言語結合は、com.sun.star.uno.XInterfaceをサポートしていません。UNOIDLメソッドのシグネチャで、XInterfaceが発生するときはいつでも、マッピングのメソッドには、System.Objectが含まれています。
XInterfaceは、UNOオブジェクトの寿命を制御するために使用されます。CLRが、ガーベージ・コレクションの仕組みを使うので、 JavaとSmalltalkと同様に、オブジェクトの寿命を明示的に制御する必要はありません。
また、XInterfaceは、queryInterfaceを呼び出すことによって、他の実装されたインターフェイスを取得する手段を提供します。CLIでは、このコードは、適当と思われるインターフェイスにオブジェクトをキャストすることによって行います。オブジェクトが、このインターフェイスを実装しない場合、続いて、System.InvalidCastExceptionが、投げられます。
先に述べた理由から、XInterfaceは、実装に機能を追加しません。その結果、このインターフェイスのためのマッピングは、存在しません。
構造体
struct
UNO IDL構造体は、継承をサポートして、CTSクラス型にマッピングされます。(つまり、クラス・ヘッドで、sealed属性は、ありません)。C#のstructキーワードで定義されているような、構造体は、値型であるため、継承をサポートしていません。例えば、
//C#
public struct Foo
{
}
ILクラス・ヘッダ:
.class public sequential ansi sealed beforefieldinit Foo
extends [mscorlib]System.ValueType
{
}
また、UNO構造体が、基準となる構造体を持っていない場合、クラスは、System.Objectを継承します。それ以外の場合には、対象とするクラスは、それぞれのUNOの基底の構造体のマッピングのクラスを継承します。UNOIDLの構造体のメンバーは、それらのそれぞれのターゲット型にマッピングされます。ターゲット型のすべてのメンバーは、パブリック・アクセシビリティを持っています。
簡単に使用するために、ターゲットは、2つのコンストラクタを持っています:引数のない1つの既定のコンストラクタと構造体を完全に初期化するコンストラクタ。2つ目のコンストラクタへの引数の順序は、それぞれのUNOIDLの記述のメンバーの位置に対応します。すなわち、最初の引数は、UNOIDLが記述する最初のメンバーをマッピングするメンバーを初期化します。引数の名前は、それらが初期化するメンバーと同じです。両方のコンストラクタは、基底クラスのコンストラクタを呼び出すことによって、適切にそれらの基底クラスを初期化します。いくつかの言語では、インスタンス・コンストラクタ・イニシャライザは、暗黙的に提供されます。例えば、 C#では、base()は、イニシャライザで呼び出す必要はありません。
構造体が、別の構造体を継承する場合、コンストラクタの引数の順序は、以下の通りです。:ルートの構造体の引数が、まず来ます。派生した構造体などの引数が続きます。同じ構造体のメンバーを初期化する引数の順序は、再び、UNOIDL宣言内のそれぞれのメンバーの位置に依存します。1つ目のメンバーの引数が、まず、現れ、2つ目のメンバーなどの引数が続きます。コンストラクタは、継承されたクラスのコンストラクタを呼び出し、それぞれの引数を渡します。
//UNOIDL
struct FooBase
{
string s;
};
struct Foo: FooBase
{
long l;
};
// C#
public class FooBase
{
public FooBase() // base() implicitly called{}public FooBase(string s) // base() implicitly
{
this.s = s;
}
public string s;
}
public class Foo: FooBase
{
public Foo()
{
}
public Foo(string s, int l): base(s)
{
this.l = l;
}
public int l;
}
ポリモーフィック構造体
Polymorphic structs
OpenOffice.org 2.0現在、新しいUNOのIDL機能、ポリモーフィック構造体があります。この構造体は、C++のテンプレートに似ています。構造体がパラメータ化され、メンバが型としてパラメータを使用できます。例えば、
//UNO IDL
struct PolyStruct
{
T member;
};
//C#
public class PolyStruct
{
public PolyStruct() // base() implicitly called
{
}
public PolyStruct(object theMember)
{
member = theMember;
}
public object member;
}
見ることができるように、パラメータによって提供される型は、System.Objectです。ポリモーフィック構造体をインスタンス化するとき、それは、Objectsであるメンバーを初期化する必要はありません。それらは、nullになります。
const
UNOIDLのcons値が、定数グループではなく、モジュールに含まれている場合、続いて、クラスは、const valueの名前で作成されます。一つだけのメンバーは、constantです。例えば、
// UNO IDL
module com { sun { star { foo {
const long bar = 111;
}; }; }; };
// C# representation of the mapping
// マッピングのC#表示
namespace unoidl.com.sun.star.foo
{
public class bar
{
public const int bar = 111;
}
}
Javaのマッピングとは対照的に、インタフェースは使用されません。なぜなら、フィールドを持つインターフェイスは、CLSに対応していません。
定数
constants
定数型は、同じ名前が定数グループとして存在するクラスにマッピングされます。クラスの名前空間は、定数型が含まれているUNOIDLモジュールを反映します。例えば、
C# representationnamespace unoidl.com.sun.star.foo //UNOIDL
module com { sun { star { foo {
constants bar
{
const long a = 1;
const long b = 2;
};
};
// C# representationnamespace unoidl.com.sun.star.foo
{
public class bar
{
public const long a = 1;
public const long b = 2;
}
}
列挙型
enum
UNOIDLの列挙型は、CTS列挙体にマッピングします。ターゲット型は、System.Enumを継承する必要があり、sealed属性を持っています。例えば、
//UNOIDL
enum Color
{
green,
red
};
//C#
public enum Color
{
green,
red
}
配列
sequence
UNOIDLの配列は、CTS配列にマッピングします。ターゲット型は、常に、この場合、このマッピングの仕様のみが、CLS型を使用するCLS型だけが含まれていることがあります。対象とする配列は、正確に1次元です。その結果、配列が含まれる配列は、配列が含まれる配列にマッピングされます。また、それらの配列は、「ジャグ配列」と呼ばれます。例えば、
//UNOIDL
sequence<long> ar32;
sequence<sequence<long>> arar32;
//C#
int ar32;
int[] [] arar32;
例外
exception
com.sun.star.uno.Exceptionは、同じ名前空間と名前を使う例外にマッピングされます。すべてのメンバーは、パブリック・アクセシビリティを持っています。対象とするunoidl.com.sun.star.uno.Exceptionは、System.Exceptionを継承します。そして、UNOIDLのExceptionのContextメンバーを示す、1つメンバーだけを持っています。ターゲット型は、UNOIDL型のMessageメンバーを表現するメンバーを持っていません。その代わりに、それは、System.ObjectのMessageプロパティを使用します。
簡単に使用するために、ターゲットは、2つのコンストラクタを持っています:引数のない1つの既定のコンストラクタと例外を完全に初期化するコンストラクタ。2つ目のコンストラクタへの引数の順序は、それぞれのUNOIDLの記述のメンバーの位置に対応します。すなわち、最初の引数は、メンバーを初期化します。それは、UNOIDLの説明の最初のメンバーをマッピングすることです。引数の名前は、初期化するメンバーと同じです。両方のコンストラクタは、基底クラスのコンストラクタを呼び出すことによって、適切にそれらの基底クラスを初期化します。例えば、
//UNOIDL
module com { sun { star { uno {
exception Exception
{
string Message;
com::sun::star::uno::XInterface Context;
};
}; }; }; };
//C#
namespace unoidl.com.sun.star.uno
{
public class Exception: System.Exception
{
public System.Object Context;
public Exception(): base(){}public Exception(string Message, System.Object Context): base(Message)
{
this.Context = Context;
}
}
}
すべてのUNOの例外は、com.sun.star.uno.Exceptionを継承します。また、同様に、それらのマッピングは、unoidl.com.sun.star.uno.Exceptionから継承します。コンストラクタの引数の順序は、継承チェーンに依存します。派生した例外などのための引数によって、最初に、unoidl.com.sun.star.uno.Exceptionの初期化の引数が来ます。引数の順序は、再び、UNOIDL宣言内のそれぞれのメンバーの位置に依存し、同じ例外のメンバーを初期化します。1つ目のメンバーの引数が、まず、現れ、2つ目のメンバーなどの引数が続きます。コンストラクタは、継承されたクラスのコンストラクタを呼び出し、それぞれの引数を渡します。例えば、 2つのメンバを持つ例外FooExceptionがあると仮定しましょう:
//UNOIDL
module com { sun { star { uno {
exception FooException: com::sun::star::uno::Exception
{
int value1;
string value2;
};
}; }; }; };
//C#
namespace com.sun.star.uno
{
public class FooException: com.sun.star.uno.Exception
{
public int value1;
public string value2;
public FooException(): base()
{
}
public FooException(string argMessage,
System.Object Context, int value1,
string value2): base(Message, Context)
{
this.value1 = value1;
this.value2 = value2;
}
}
}
サービス
services
一つのインターフェイスに基づいたすべてのサービスのための、サービスのタイプセーフ・インスタンスを有効にするCLIクラスが、提供されます。例えば、サービスcom.sun.star.Testがある場合、続いて、これらの2つの方法で作成することができました。
//C#
// com.sun.star.Test implements interface XTest
com.sun.star.uno.XComponentContext xContext = ...;
object service=
xContext.getServiceManager().createInstanceWithContext(
"com.sun.star.Test", xContext );
XTest x = (XTest) service;
// This is the new way
// これは、新しい方法です。
XTest y = com.sun.star.Test.create(xContext);
サービス・コンストラクタ・メソッドが、例外を投げるために指定される場合、続いて、それぞれのCLIメソッド・ハットのユーザー定義した属性uno.ExceptionAttributeは、それに適用されます。詳細は、「データ型」の「サービス/サービスコンストラクタ」の章を確認してください。
シングルトン
singletons
サービスと同様に、新しいスタイルのシングルトンのCLIクラスもあります。例えば、シングルトンcom.sun.star.TestSingletonがある場合、これらの2つの方法で作成することができます。:
//C#
com.sun.star.uno.XComponentContext xContext = ...;
uno.Any a = xContext.getValueByName("com.sun.star.TestSingleton");
XTest x = (XTest) a.Value;
//The alternative:
// 代替:
XTest x = com.sun.star.TestSingleton.get(xContext);
追加の構造
原文「Additional Structures」
完全な型のマッピングが達成されるかどうかは、ターゲット環境の機能に依存します。CLIに対応する物がないUNOIDL属性は、ユーザー定義した属性にマッピングされます。したがって、マッピングで情報が失われることはありません。属性は、以下によって評価することができます。:
- CLI-UNOブリッジ
- ソースコード・ファイルやドキュメントを作成したツール
- CLIアセンブリを使用して、UNOに型情報を動的に提供するツール。
ExceptionAttribute
uno.ExceptionAttributeは、インターフェイス・メソッド、プロパティ・メソッド(getやset)やサービス・コンストラクタ・メソッドに適用することができます。それには、メソッドによって投げることができる例外に関する情報が含まれています。ソース・コードは、cli_ure/source/basetypes/uno/ExceptionAttribute.csで見つけることができます。
OnewayAttribute
uno.OnewayAttributeは、それらのインターフェイス・メソッドに適用されます。UNOIDLの宣言は、それらにoneway属性を適用しました。ソース・コードは、cli_ure/source/basetypes/uno/OnewayAttribute.csで見つけることができます。
BoundPropertyAttribute
uno.BoundPropertyAttributeは、適用されるbount属性を持っている、それぞれのUNOIDL宣言に、プロパティを適用します。ソース・コードは、cli_ure/source/basetypes/uno/BoundPropertyAttribute.csで見つけることができます。
TypeParametersAttribute
uno.TypeParametersAttributeは、ポリモーフィック構造体に適用されます。それは、構造体の型リストで、名前の情報を維持します。例えば、構造体は、名前の付いたcom.sun.star.Foo<T, C>の場合があります。そして、属性は、型リストの最初の型の名前は、 "T"、そして、2つ目は、"C"の情報が含まれています。
CLIが、テンプレートをサポートするとき、この属性は、使われなくなり、そして、CLI-UNO言語結合は、それらを採用しました。ソース・コードは、cli_ure/source/basetypes/uno/ParameterizedTypeAttribute.csで見つかります。
TypeArgumentsAttribute
uno.TypeArgumentsAttributeは、ポリモーフィック構造体のインスタンス化に適用されます。それは、ポリモーフィック構造体が戻り値、パラメータやフィールドで使われるとき、現れます。それには、型リストの実際の型に関する情報が含まれています。例えば、関数は、型com.sun.star.StructFoo<char, long>のパラメータを持っています。続いて、CLIパラメータは、型のリストが含まれる属性、この例では、System.CharとSystem.Int32を持っています。
CLIが、テンプレートをサポートするとき、この属性は、使われなくなり、そして、CLI-UNO言語結合は、それらを採用しました。ソース・コードは、cli_ure/source/basetypes/uno/TypeArgumentsAttribute.csで見つけることができます。
PolymorphicType
uno.PolymorphicTypeは、System.Typeから派生しています。ポリモーフィック構造体の型が必要になるたび、それが使われます。例えば、
//UNOIDL
void func1([in] type t);
void func2([in]any a);
type func3();
any func4();
呼び出し側が、func1でポリモーフィック構造体の型を渡そうとする場合、そして、それらは、typeof(structname)を使うことができません。その代わりに、uno.PolymorphicTypeを作成する必要があります。anyにポリモーフィック構造体が含まれるとき、func2も同じです。UNOメソッドが、ポリモーフィック構造体の型を返す場合、続いて、ブリッジは、System.Typeではなく、PolymorphicTypeが返されることを保証します。
PolymorphicTypeは、静的関数によって構築されます。:
public static PolymorphicType GetType(Type type, string name)
この関数は、与えられた型と名前の組み合わせに対して、インスタンスが1つだけ存在することを保証します。
CLIが、テンプレートをサポートするとき、この属性は、使われなくなり、そして、CLI-UNO言語結合は、それらを採用しました。ソース・コードは、cli_ure/source/basetypes/uno/PolymorphicType.csで見つけることができます。
ライフタイムの管理と取得するインターフェイス
原文「Lifetime Management and Obtaining Interfaces」
CLRは、開発者のタスクに任せるのではなく、オブジェクトの存続期間を追跡し続ける点で、Javaランタイムと類似しています。オブジェクトが、もはや参照されなくなると(到達できない)、CLRは、そのオブジェクトを削除します。その結果、C ++で使用されているような参照の計算は、必要ありません。それゆえに、com.sun.star.uno.XInterface:acquireとcom.sun.star.uno.XInterface:releaseは、必要でありません。
XInterfaceには、3番目のメソッドqueryInterfaceを持っています。これは、特定のインタフェースのオブジェクトを問い合わせるために使用されます。この言語バインディングは、queryInterfaceを使用しません。その代わりに、オブジェクトは、望むインターフェイスにキャストすることができます。例えば、
// C#
try {
XFoo bar = (XFoo) obj;
} catch (System.InvalidCastException e) {
// obj does not support XFoo
// objは、XFooでは、サポートされていません
}
// using keywords is and as
if (obj is XFoo) {
// obj supports XFoo
// objは、XFooで、サポートされています
}
XFoo foo = obj as XFoo;
if (foo != null)
{
// obj supports XFoo
// objは、XFooで、サポートされています
}
// C++ with managed extensions
// 管理された拡張機能を持つC ++
XFoo * pFoo = dynamic_cast< XFoo * >( obj );
if (XFoo != 0)
{
// obj supports XFoo
}
try {
XFoo * pFoo = __try_cast< XFoo * >( obj );
} catch (System::InvalidCastException * e) {
// obj does not support XFoo
// objは、XFooでは、サポートされていません
}