共通言語ランタイム)、あるいは.NETのライブラリを利用するための環境構築を行いました。ここでは、そのCLRを利用してアセンブリのロードや各種機能の利用を行う方法を紹介します。7.0」を前提に記述します。準備編で紹介したコードを前提として記述していますのでご注意ください。ここからは基本的にCLR/.NETのリフレクションを使った処理になりますが、一部VB特有の解決方法をしている場合があります。アセンブリのロードクラスインスタンスの作成インスタンスメソッドの呼び出しCOM定義がある場合IDispatchサポートがある場合それ以外の場合スタティックメソッドの呼び出しまとめアセンブリのロードCLR/.NETにおいて「アセンブリ」はWindowsにおけるEXEやDLLのようなものであり、複数のクラスやインターフェイス、および実行コードなどをまとめたバイナリーデータの単位となっています。CLRの上で何かしらの処理を実現したい場合は、1つ以上のアセンブリを読み込んでそれらに含まれる機能を利用していくことになります。シンプルにアセンブリをロードするには、AppDomainクラスの「Load(String)」メソッドを使うことができますが、このメソッドはCOMオブジェクトとしては「Load_2」という名前で公開されています。このメソッドでSystem.Reflection.Assemblyクラス(COMオブジェクト上はmscorlib.Assembly)のインスタンスを得ることができます。domain.Load_2("mscorlib")なお、初期状態では「mscorlib」のみがロードされており、最後の行のアセンブリ読み込みは改めて読み込みが行われるわけではありませんが、このコードは「mscorlib」のAssemblyのインスタンスを取得するという目的も兼ねています。Name形式で指定します。後述するスタティックメソッドの呼び出し方法を用い、Assembly.LoadWithPartialName(String)メソッドを使うことで部分的な名前でアセンブリを読み込むことができますが、現在非推奨となっています。PublicKeyToken=b77a5c561934e089")クラスインスタンスの作成アセンブリがロード出来たら、そのアセンブリに属するクラスのインスタンスを作成することができます。コンストラクターのパラメーターを要求しないクラスであれば、AssemblyクラスのCreateInstanceメソッドを用いるのが容易です。(COMオブジェクト上は「CreateInstance」の名前になります。1つ以上のパラメーターを受け取るクラスの場合は、System.Type(mscorlib.Type)のインスタンスを取得し、Reflectionの機能を用いてコンストラクターの情報(System.Reflection.ConstructorInfo)を取得、呼び出しを行います。スポンサーリンクインスタンスメソッドの呼び出しクラスのインスタンスを作成しただけでは、多くの場合ほぼ何も処理をしたことにならないため、クラスが持つメソッドの呼び出しを行います。メソッドの呼び出しは、クラスのCOMオブジェクトとしての扱いによって主に以下の3パターンに分かれます。ブラウザー」で目的のクラスを表示した際に目的のメソッドが表示される場合、多くのケースでは通常のCOMクラスと同じようにメソッド呼び出しをすることができます。前述のAssemblyクラスのメソッド呼び出しがそれに該当しています。ブラウザー」で目的のクラスを表示しても何もメソッドが表示されないケースがあります。「クラスインスタンスの作成」で作成したSystem.Randomクラスに対応する「mscorlib.Random」もその一例です。System.Randomクラスもそうですが、COMには公開されているクラスの場合、IDispatchインターフェイスを継承していることがあります。この場合、(通常のVBオブジェクトと同じですが)入力候補に表示されないメソッドをそのまま記述することで呼び出しを行うことができます。型にSetしてからVBのObject型変数にSetし、その変数を使って呼び出しを行います。属性が付いている場合に該当します。引数の数が誤っている場合、基本的にはCOMのエラーが発生します。(状況によっては異常終了する場合がありますが条件は未確認です。)また、VBのCallByName関数を用いることもできます。オーバーロードされたメソッドは上記の例のようにCOMからは「_2」「_3」などといった接尾辞を名前に付ける必要がありますが、どのオーバーロードがどの番号に対応しているかを確認するのは難しいため、次の「COM非対応の場合」の方法を用いる方が確実である場合があります。(基本的にはアセンブリ内部でのメソッド定義順になっていると思われますが未確認です。以上の方法でインスタンスのメソッドを呼び出すことができない場合は、CLRのリフレクション機能を用いることで呼び出すことができます。具体的には、インスタンスに対応する型のSystem.Typeインスタンスを取得し、GetMethods(BindingFlags)メソッドで一覧を取得して目的のメソッドを探します。object[])メソッド(COM上ではInvoke_3)を利用してインスタンスに対するメソッドを呼び出します。オーバーロードされていないメソッドの場合はGetMethod(string)メソッドを利用することもできます。オーバーロードされたメソッドの場合名前だけでは判定できないため、GetMethodsメソッドでパラメーター数・型情報を元に検索します。Type[])メソッド(COM上ではGetMethod_5)はVBから直接呼び出すことができません。Type[])メソッド」のMethodInfoをここで紹介する方法で事前に取得しておき、これを使って呼び出すという手はあります。引数なしのGetMethods()メソッドを利用しても構いませんが、BindingFlags引数があると多少絞り込みができる分探しやすくなります。メソッドの検索を行うコードはそこそこのボリュームになるため、以下のような関数を定義してそれを利用することとします。「mscorlib.Object」経由で「VBのObject」に変換するコードが途中にありますが、この変換を行うのは、ほとんどのCLRクラスがCOM的には直接IUnknownまたはIDispatchを継承しているもののIDispatchの各メソッドを正しく実装していないことが多く、その一方で、mscorlib.Objectに変換した場合は仮想関数テーブルが変わって呼び出されるIDispatchメソッドが厳密に変わり、mscorlib.Objectが提供?しているIDispatchメソッドであれば呼び出すことができるためです。それをVBのObject型変数に変換することでVB上から意図通りにIDispatchメソッドを利用することができるようになります。型「t」に含まれる名前「Name」のメソッドを検索します。対応する引数の数だけ指定します。Function実際の利用例は以下の通りです。Invoke_3に渡す引数はVariantの配列になりますが、各要素は呼び出したいメソッドの型に応じたデータにしておく必要があります。Frameworkの呼び出し時には.NET側の型に自動的に変換する機構が用意されています。Variant」)をご覧ください。スタティックメソッドの呼び出しスタティックメソッドの場合、VBでは厳密な意味でのスタティックメソッド呼び出し構文が存在せず、「<object>.<Method>()」の形式で呼び出すことができませんが、上記インスタンスメソッドの呼び出しにある「COMまたはVBで非対応の場合」と同様、リフレクションの機能を用いることで呼び出すことができます。ブラウザー」における「グローバル」に表示されるプロパティーやメソッドは、COMの型定義で特別な定義がなされているクラスや「モジュール」のメンバーであり、クラスメンバーの場合は内部的にはインスタンスメソッドの呼び出し、「モジュール」メンバーの場合はDLL呼び出しになっています。リフレクションの機能を用いる場合は以下のようになります。cobjEncoding.GetString(by)まとめCLR/.NETのアセンブリをロードし、そこに定義されるクラスの機能を用いる場合は、COMのサポートが有効なアセンブリであればVBで一般的な手法とほぼ同じようにして利用することができますが、COMのサポートがない場合でもリフレクション機能を経由することでメソッド呼び出しを行うことができます。これにより、CLR/.NETのライブラリ側でのCOMサポートなしにそれらの機能をVBから利用できるようになります。次回では、デリゲートの利用やその他発展的な利用方法(?)などを紹介したいと思います。Kuri-Applications.。