CLI と WMI におけるクラスとマップ
マネージ コードでは、クラス定義の概念がプログラミングの中核となっています。WMI も、マネージ コードと同じようなクラス定義の基本原則に基づいています。しかし、WMI にはクラスを記述するための独自の文法 (MOF) と、プログラムでクラスを定義するための API があります。
実装の根本的な目標は、アプリケーションを管理しようとするツールにとって役立つ情報を公開することです。トレースやログ ファイルなど、その他の実装テクノロジでは、アプリケーションは構造化されていない診断情報の生のブロック (単純な文字列など) しか提供しません。WMI を使用した実装では、スキーマ ベースの豊富な情報を公開できます。そのために、アプリケーションは実装を通じて提供しようとする情報を記述した WMI クラスのセットを定義します。これらのクラス定義は WMI によって公開され、管理ツールからアクセスできます。クラス定義は、アプリケーションの実行時だけでなく、アプリケーションのインストール後は常に使用できる必要があります。実行時には、アプリケーションは WMI クラスによって記述されている実際のデータを提供します。
いつでも参照できる WMI のクラス定義のモデルは、CLI のマネージ クラスとメタデータのモデルにたいへんよく似ています。System.Management.Instrumentation 名前空間は、WMI クラスと CLI クラスの類似性を利用して、開発者がマネージ コードでクラス定義を記述することによって WMI クラスを定義できるようにします。つまり、マネージ コードの開発者は、新しい知識を習得しなくても WMI クラスを定義できます。
通常は、マネージ コード クラスは WMI クラスに割り当てられます。しかし、マネージ クラスで記述できない特性を WMI クラスが持っている場合もあります。たとえば、WMI のプリミティブは NULL 値をとることができますが、共通型システム (CTS: Common Type System) の値型は NULL 値をとることができません。System.Management.Instrumentation 名前空間では、開発者は、CTS で記述できない対象を表している WMI クラスは記述できません。
マネージ クラスから WMI クラスへの割り当ての基本的な方法をいくつか次に示します。
パブリック マネージ クラスだけが WMI クラスに割り当てられます。また、パブリック メンバだけが WMI クラス定義に割り当てられます。
プリミティブ値型は、WMI の CIM 型に適切に割り当てられます。
また、String、DateTime、TimeSpan の各参照型は、WMI CIM の対応する型に割り当てられます。
マネージ コード内の配列は、WMI クラス定義内の配列に割り当てられます。
CLI では、値型と参照型が区別されます。
WMI はこの区別を行わず、どちらの型も WMI クラス定義に割り当てることができます。
WMI は、埋め込みオブジェクトだけでなく、その他のオブジェクトへの参照もサポートします。
System.Management.Instrumentation の最初のバージョンでは、埋め込みオブジェクトだけがサポートされています。値型のメンバを含むマネージ クラスは、埋め込みオブジェクトを含む WMI クラスに割り当てられます。参照型のメンバを含むマネージ クラスも、埋め込みオブジェクトを含む WMI クラスに割り当てられますが、将来のバージョンではランタイム参照が WMI 参照によって表されるように開発者が指定できるようになる予定です。
マネージ クラスの継承階層構造は、WMI 内の継承階層構造によって表されます。
System.Management.Instrumentation の最初のバージョンでは、WMI の既定値をマネージ コードで表すことはできません。
マネージ クラス フィールドのフィールド初期化子は、WMI の既定値に割り当てられません。
WMI はフィールドとプロパティを区別しません。
マネージ クラス定義では、フィールドとプロパティはいずれも WMI プロパティに割り当てられます。
マネージ クラス定義の名前空間は、WMI クラス定義の名前空間とはまったく無関係です。
つまり、マネージ クラスが MyCompany.MyApplication 名前空間で定義され、それに関連する WMI 実装クラスが WMI の名前空間 root\MyCompany として定義されることもあり得ます。
WMI は、修飾子と呼ばれる、属性に似た概念をサポートします。
System.Management.Instrumentation では、マネージ コード属性と WMI 修飾子との間の割り当てはありません。System.Management.Instrumentation 名前空間には属性がありますが、それらの属性は WMI クラス定義では修飾子によって表されません。マネージ コード属性と WMI クラス定義の修飾子の割り当てを可能にするために、System.Management.Instrumentation 名前空間はいくつかの属性クラスを定義し、開発者が新しい API を使用する代わりに宣言構文でマップを定義できるようにします。ここでもまた、マネージ コードに精通している方ならば、既に持っている知識を活用できます。既に説明したように、実装は、デザイン時のクラス定義と実行時のデータ提供という大きく分けて 2 つの段階で構成されます。最初の段階では属性の使用がたいへん重要であり、それによって、マネージ クラスのメタデータは実装のスキーマを完全に記述できるようになります。その後、このメタデータは、管理ツールから参照できる WMI スキーマを作成するために使用されます。
参照
System.Management を使用する .NET Framework アプリケーションの実装 | 管理イベントの公開 | 管理データの公開 | 継承 | 実装されたアプリケーションのスキーマ登録