この特集のトップページへ
Chapter 4:データストア層の構築

head2.gif 4.2.3 COMコンポーネントのアップデート
 さて,一般的に開発中のCOMコンポーネントには,メソッドを追加したり,仕様を変更したりといった具合に,どんどんと更新する必要が生じる。しかし,プログラムを修正し,コンパイルし直しても,その修正はCOM+には伝わらない。なぜならば,Visual Basicは,コンパイルしたときにCOM+ではなく,COMの管理下にあるレジストリしか更新しないためである。そのため,プログラムをコンパイルしたら,生成されたdllファイルを[コンポーネントサービス]管理ツールに登録されているCOM+アプリケーションにドラッグ&ドラップし,改めてCOMコンポーネントを登録し直す必要がある。

 しかし,いったんCOM+アプリケーションのCOMコンポーネントとして登録されると,そのCOMコンポーネントはCOM+の支配下に置かれるため,更新できなくなることがある。COMコンポーネントから実体化されているCOMオブジェクトが存在するときには,COMサーバーとなっているdllファイルが利用中であるために,上書きできないというのは当然だが,COM+では効率を向上するために,COMオブジェクトを解放したとしても,しばらくのあいだはCOM+がCOMオブジェクトを本当に解放しないで,別のCOMクライアントからの呼び出しに備えているというケースがある。そのため,見かけ上はCOMコンポーネントを使っているCOMクライアントが1つもなくても,実際にはCOMサーバーとなっているdllファイルが利用されていることもある(これについては次章で解説する)。

 そのような場合には,COM+に対して,COM+アプリケーションをシャットダウンするように要求する。「COM+アプリケーションをシャットダウンする」とは,そのCOM+アプリケーションに含まれるCOMコンポーネントから実体化されているCOMオブジェクトを,すべて破棄するということである。この作業によって,COMコンポーネントとCOMサーバーが解放される。


One Point!シャットダウンという作業をより正確にいえば,dllhost.exeというプログラムを終了させることである。dllhost.exeは,[アクティブ化の種類]として[サーバーアプリケーション]を選択した場合にCOM+アプリケーションごとに実行されるプログラムであり,COMサーバー(dllファイル)を読み込んで実行する機能を有する。dllファイルを更新できなくなるのは,dllhost.exeが該当するdllファイルを利用しているためである。

 COM+アプリケーションをシャットダウンしたい場合には,シャットダウンしたいCOM+アプリケーションを右クリックし,表示されるメニューから[シャットダウン]を選択する(Fig.4-23)。

Fig.4-23 COM+アプリケーションのシャットダウン
fig4_23.gif


One Point!COM+アプリケーションをシャットダウンしても,シャットダウンした以外のCOM+アプリケーションにはまったく影響がない。メニューから[シャットダウン]を選んだときに解放されるのは,そのCOM+アプリケーションに含まれているCOMコンポーネントだけである。

 これによって,COMコンポーネントを更新できるようになる。もし,COMコンポーネントを更新したあとでCOM+アプリケーションを再起動したいのであれば,Fig.4-23のメニューで[開始]を選択すればよい。[開始]を選択すると,COM+アプリケーションに含まれているCOMコンポーネントを提供するCOMサーバー(dllファイル)がメモリ上にロードされ,COMコンポーネントを利用する準備が整う。ただし,[開始]を選択しなくても,はじめてCOMコンポーネントが必要とされた場合(つまり,COMクライアントから呼び出された場合)には,自動的にCOMサーバーがメモリ上にロードされるため,必ずしも更新後に[開始]を選択する必要はない。

 まとめると,COMコンポーネントをアップデートするためには,次の手順をとる必要があるということである。

  1. COM+アプリケーションをシャットダウンする
  2. COM+アプリケーションに登録されているCOMコンポーネントを削除する
  3. Visual Basicでコンパイルしてdllファイルを作る
  4. コンパイルしたdllファイルを,[コンポーネントサービス]管理ツールに登録されているCOM+アプリケーションにドラッグ&ドロップして再登録する
  5. COM+アプリケーションを開始する

 2の手順は,COMコンポーネントの仕様が変更されていなければ(正確にいえば,COMコンポーネントのクラスIDが変更されていなければ)不要である。しかし,COMコンポーネントに新しいメソッドが加わったり,一部のメソッドの引数の種類が変わったりしている場合には,2の手順が必要となる。もし古いCOMコンポーネントを削除しないまま,新しいCOMコンポーネントをドラッグ&ドロップしてしまうと,同じCOMコンポーネントが上書きされず,複数登録されてしまうので注意する。

prevpg.gif Chapter 4 5/16 nextpg.gif