共通言語ランタイム)、あるいは.NETのライブラリを利用するための方法を紹介しています。VBやVBAはCOMベースでプログラムが実行されるため、COM相互運用をサポートした.NETアセンブリであれば直接利用することができますが、System.Xmlなどサポートしていないアセンブリは利用することができません。ここで紹介する方法を用いれば、ほぼすべての.NETアセンブリを利用可能になります。利用できないアセンブリがあるかどうかは未確認です。VBAでワークシート上のデータと特定の.NETライブラリとを絡めたい、などといった場合において有用であると考えられます。今回は以下の3回に分けてその方法を紹介します。Delegateの利用などまずはCLRそのものをVB上で利用できるようにする処理を紹介します。7.0」を前提に記述します。2010以降のVBAマクロで使用されます。(「64ビット版VBA用の64ビット版COMライブラリを作る」でも少し触れていますので必要に応じて参照してください。ユーティリティ関数CLRの初期化WindowsにおいてCLRは、C/C++などで記述・生成されたネイティブコードからCLR上のドメインやアセンブリ経由で機能を利用できるようするために、いくつかのネイティブ用関数やインターフェイスなどを提供しています。ランタイムのロードは次の手順で行います。「ランタイムホスト」が利用できるようになると晴れてCLRの機能が利用できるようになるため、まずはこの手順を進めます。ICLRMetaHostインスタンスを取得まずはICLRMetaHostインターフェイスのインスタンスを取得します。このインターフェイスは、システムにインストールされているランタイムを列挙し、指定バージョンに対応するランタイムの操作を行うためのインスタンスを取得する機能を提供しています。バージョン4以上であれば、「mscoree.dll」がエクスポートしている関数「CLRCreateInstance」経由で取得します。旧バージョンの場合」をご覧ください。Long」などの配列も指定できるようにしています。ppInterfaceは「IUnknown*」(およびその派生)以外のデータが出力されることは無いため、明示させています。ICLRMetaHostのインスタンスを得るには、この関数にCLSIDとして「{9280188D-0E8E-4867-B30C-7FA83884E8DE}」(CLSID_CLRMetaHost)、IIDに「{D332DB9E-B9B3-4125-8207-A14884F53216}」(IID_ICLRMetaHost)を指定します。用のタイプライブラリ)には「ICLRMetaHost」(あるいは「CLRMetaHost」)が含まれていません。ICLRMetaHostはIUnknownから直接派生したインターフェイスであるため、型定義の無い状況でメソッドを呼び出すには仮想関数テーブルをうまく用いるしかありません。ある「DispCallFunc」関数を用いることができます。ここではVB向けに以下のように定義します。定義が誤っていたため修正しました。テーブルにおけるバイトオフセット)」を指定し、残りの引数にそのメソッドの定義に基づいた情報とパラメーターを入れていきます。仮想関数テーブルのインデックス値は、C/C++向けのヘッダーファイル等で調べる必要があります。この関数を直接利用するのは少々面倒であるため、以下のようなラッパー関数「VBCallAbsoluteObject」を定義してそれを用いることとします。対応するメソッドを呼び出します。VT_*)で指定します。メソッドの引数を指定します。明示的な型変換を行ってください。(具体的な実装はページの最後をご覧ください。前述の機能によりICLRMetaHostのメソッドを自由に呼び出せるようになったため、本題に戻って「ICLRRuntimeInfo」のインスタンスを取得します。CLRのバージョンを引数として受け取るため、今回は「v4.0.30319」を用いて呼び出すこととします。「GetRuntime」は仮想関数テーブルのインデックス番号が「3」となります。バージョンなどを指定しますが、システムで実際に利用できるバージョンはICLRMetaHostのEnumerateInstalledRuntimesメソッドなどで確認することができます。ここではその説明は省略します。取得コードの続きです。Err.Raise(hr)ランタイムのホストインスタンスを取得CLRの情報を提供するICLRRuntimeInfoのインスタンスを取得できたら、ランタイムのホストとして機能を提供する「ICorRuntimeHost」インターフェイスのインスタンスを取得します。これを得ることで、アセンブリのロードなどCLRの各種機能を扱うことができるようになります。メソッドを利用します。「GetInterface」は仮想関数テーブルのインデックス番号が「9」となります。Engine」の、「mscoree.CorRuntimeHost」クラスのインスタンスとして扱うことができます。こちらは型定義があり一部を除いてメソッドを呼び出すことができるため、(事前にIDEにて「参照設定」を追加した上で)「CorRuntimeHost」に変換しておきます。タイプライブラリが一覧にない場合は、「<フレームワークのディレクトリ>\mscoree.tlb」(TLBファイル)を手動で読み込みます。「<フレームワークのディレクトリ>」は「%SystemRoot%\Microsoft.NET\Framework\v4.0.30319」(64ビット版の場合は「%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319」)などといった場所になります。取得コードの続きです。pCorRuntimeHost以上により、「host」変数にホストインスタンスが代入されたため、これを起点にCLRの機能を利用していきます。外部アセンブリを実行するのみである場合は「ICLRRuntimeHost」インターフェイスのインスタンスを取得する方が容易に実現可能です。{90F1A06C-7712-4762-86B5-7A5EBA6BDB02}」を用いてインスタンスを取得します。CLR利用の開始と終了CorRuntimeHostクラスには「Start」メソッドと「Stop」メソッドがあり、明示的にCLRを起動・終了することができます。ヘルプには「通常では不要」とあり、特にStartについては何かしらの機能を利用した段階で自動起動されますが、プログラムとして生成されていないVBアプリケーションでの実行やVBAでは同じプロセス上でプログラムの起動終了が行われるため、予期しない動作を防ぐ目的で明示的に呼び出しておきます。Stopメソッドは必ず呼び出すようにしてください。(VBAの場合、Stopをし忘れるとVBAのホストプログラム終了時に異常終了する可能性があります。終了できるようにするために、「VBAの終了タイミングと終了処理の記述」で紹介している方法の利用も検討してください。取得コードの続きです。host.StopCLR初期化のまとめここまでの処理を、以下のように関数にまとめました(一部コメントは省略しています)。この関数「CreateCorRuntimeHost」を呼び出すことでホストインスタンスを得ることができます。演算子でも作成することができますが、そのインスタンスを利用した場合一部CLR機能の呼び出し時に内部例外が発生する場合があるのを確認しており、またバージョン指定もできないため、利用しない方が良いと思われます。オブジェクトを作成します。バージョン4未満の場合はCLRCreateInstance関数を利用できませんが、代わりにCorBindToRuntimeEx関数を利用することができます。この関数を利用すると、指定したバージョンに対応するICorRuntimeHostインターフェイスのインスタンスを取得することができます。以降ではdeprecated」となっている点に注意が必要です。前述の「CreateCorRuntimeHost」と同じように利用できます。Functionスポンサーリンクドメインの利用CLRでは「ドメイン」と呼ばれる概念の中でアセンブリのロードや実行コードの処理などを行います。少なくとも(VB上で)アセンブリをロードするには「AppDomain」(System.AppDomain)インスタンスが必要になるため、以下のような方法でドメインのインスタンスを取得します。AppDomainインスタンスの型情報はタイプライブラリ/DLLの「mscorlib.dll」を参照設定に追加することで利用可能です。タイプライブラリが一覧にない場合は、「mscoree.dll」の場合と同様に「<フレームワークのディレクトリ>\mscorlib.tlb」(TLBファイル)を手動で読み込みます。これによって取得したAppDomainインスタンスは「System.AppDomain」クラスの(COM用にラップされた)インスタンスであるため、ここからCLRのさまざまな機能を利用することができるようになります。既定のドメインの取得CLRがロードされると「既定のドメイン」が必ず作成されているため、これを利用することができます。既定のドメインを取得するには「GetDefaultDomain」メソッドを利用します。オブジェクトとします。一方で新たにドメインを作成することもできます。今回のような目的では必要ではありませんが、アセンブリの実行環境の分離、デバッグ用に分かりやすい名前の付与、およびセキュリティを考慮した制限の追加、などの目的で利用できます。新たにドメインを作成するには「CreateDomain」メソッドを利用します。VBA上で実行する場合は、CLR実行環境の起動と終了(「ドメインのアンロード」を参照)を明確にするために、既定のドメインの利用ではなく新たなドメインの作成を強く推奨します。既定のドメインを用いた場合、CLRの呼び出し状況によってはVBAをホストするアプリケーションの終了時に異常終了する場合があります。(VB6.0系で動作させる場合も開発環境での確認を考慮すると作成した方が良いと考えられます。利用してドメイン初期化時の情報を与える「CreateDomainEx」メソッドもあります。用途に応じて使い分けてください。オブジェクトとします。作成したドメインは以下のようにアンロードすることができます。一時的な目的で作成したドメインが不要になった場合は明示的にアンロードしておきます。メソッドが呼び出された場合すべての処理が終了します。NothingまとめVB(VBA)でCLR/.NETの機能を利用するには、以下の手順でそれぞれインスタンスの初期化・取得を行い、AppDomainのインスタンスを手に入れます。System.AppDomain)次回では、このドメインを元にアセンブリのロードやそのアセンブリにあるインスタンスの取得などを行ってみます。余談ですが、今回の方法はCopyMemory(MoveMemory)などを用いておらず、ポインターアドレスを直接扱うのはDispCallFunc関数の利用周り程度であるため、機械語実行などに比べてやや安全にプログラムを試すことができます。処理を簡単にするため、説明では以下のユーティリティ関数を定義済みの関数として用いています。文字列表現のGUIDを4要素のLong型配列に変換します。その配列のデータはGUIDのポインターとして利用することができます。3)」である必要があります。}」の有無どちらでも指定できます。「X」はすべて16進数である必要があります。対応するメソッドを呼び出します。VT_*)で指定します。メソッドの引数を指定します。明示的な型変換を行ってください。Kuri-Applications.。