サービスコンポーネントのさまざまな配置方法(中編)
ライブラリアプリケーションにサービスコンポーネントを配置する
まず、Visual Studio .NETで[File]メニューの[New Project]を選択して新しいプロジェクトを作成します。次の画面に示すように、[New Project]ダイアログボックスで、プロジェクトの種類としてVisual C#クラスライブラリを選択し、プロジェクトの名前として「LibraryApp」と入力します。
プロジェクトを作成できたら、既定クラス(Class1)の名前を「SampleLibrary」に変更し、次のように修正します。COM+に用意されているサービスを利用するために、SampleLibraryクラスをServicedComponentクラスから派生させるようにします。
public class SampleLibrary : ServicedComponent { public SampleLibrary() { } public string WriteMessage() { return "This message is from a library application"; } }
ここでは、文字列を返すWriteMessageという非常に簡単なメソッドを用意しています。
次に、snユーティリティを使ってキーファイルを生成します。キーファイルを生成するには、Visual Studio .NETコマンドプロンプトで次のコマンドを入力します。
キーファイルを生成できたら、そのキーファイルをプロジェクトに追加します。さらに、「AssemblyInfo.cs」ファイルに次の行を追加します。
[assembly: AssemblyKeyFile("..\\..\\LibraryApp.snk")] [assembly: ApplicationName("LibraryApp")] [assembly: ApplicationActivation(ActivationOption.Library)] [assembly: Description("This is a library application")]
このコードについて詳しく説明しましょう。
- ApplicationName
- ApplicationActivation
- Description
ActivationOption.Libraryを指定して、サービスプロセスをクライアントのプロセス空間でアクティブ化することを指定しています。サービスコンポーネントをコンパイルしたら、COM+にアセンブリを配置する必要があります。配置するには、コマンドラインから次のようにサービスインストールユーティリティ「regsvcs.exe」を実行します。
regsvcs LibraryApp.dll
このコマンドラインユーティリティを実行すると、基本的に次の処理が行われます。
- まず、CLRアセンブリがCOMコンポーネントとして登録されます(アセンブリ登録ユーティリティ「regasm.exe」を実行した場合と同じです)。
- COMタイプライブラリが生成され(タイプライブラリエクスポータ「tlbexp.exe」を実行した場合と同じです)、そのタイプライブラリを使って、アセンブリ内の設定済みクラスがCOM+カタログに配置されます。
- 次に、既定で、アセンブリの
ApplicationName属性とApplicationActivation属性に指定されているターゲットアプリケーションが作成されます。 - 最後に、.NETのReflection APIを使って、アセンブリ内の設定済みクラスのメタデータが取り出され、その情報に従って、各クラスに適切な宣言属性が設定されるようにCOM+カタログが更新されます。設定済みクラスで宣言属性が具体的に指定されていない場合は、既定値が使用されます。
regsvcsユーティリティを実行したら、コンポーネントサービスエクスプローラを起動して、コンポーネントがCOM+に正しくインストールされていることを確認します。
この画面からお分かりのように、「AssemblyInfo.cs」ファイルでの指定どおりにLibraryAppという新しいライブラリアプリケーションが作成され、LibraryAppライブラリアプリケーションの内側にLibraryAppコンポーネントがインストールされています。このサービスコンポーネントをテストするため、簡単なVisual C# Windowsアプリケーションを作成してメソッドを呼び出してみましょう。
サービスコンポーネントのクライアントアプリケーション
クライアントアプリケーションの名前を「LibraryAppClient」とし、既定フォーム「Form1.cs」にコマンドボタンを追加します。次に、[Add Reference]オプションを使って、LibraryAppアセンブリの参照を追加します。
さらに、ファイルの先頭に次のステートメントを追加して、必要な名前空間の参照をインポートします。
using LibraryApp;
コマンドボタンのクリックイベントに、次のコード行を書きます。
private void btnInvoke_Click(object sender, System.EventArgs e) { SampleLibrary obj = new SampleLibrary(); MessageBox.Show(obj.WriteMessage()); }
アプリケーションを実行してコマンドボタンをクリックすると、表示されているサービスコンポーネントから返されたメッセージが表示されます。
COM+でライブラリアプリケーションにサービスコンポーネントを配置する方法の説明はこれで終わりにし、次は、サーバーアプリケーションの一部としてサービスコンポーネントを配置する方法を解説します。
サーバーアプリケーションにサービスコンポーネントを配置する
既に説明したとおり、サーバーアプリケーションに配置したサービスコンポーネントは、常にCOM+実行可能ファイル「dllhost.exe」のアドレス空間でアクティブ化されます。さらに、サービスコンポーネントは(COM+サーバーアプリケーションに配置する場合は)GACにも配置する必要があります。これは、COM+が、クライアントが実際に実行されているディレクトリに関係なく、アセンブリをロードできるようにするためです。この例では、次のように、「ServerApp」という新しいVisual C#クラスライブラリアプリケーションを作成します。
プロジェクトを作成したら、既定クラスの名前を「SampleServer」に変更し、次のコード行を追加します。
public class SampleServer : ServicedComponent { public SampleServer() { } public string WriteMessage() { return "This message is from a server application"; } }
前述の例と同じように、キーファイル「ServerApp.snk」を作成してプロジェクトに追加します。次に、「AssemblyInfo.cs」ファイルに次の行を追加します。
[assembly: ApplicationName("ServerApp")] [assembly: Description("This is a server application")] [assembly: ApplicationActivation(ActivationOption.Server)] [assembly: AssemblyKeyFile("..\\..\\ServerApp.snk")]
ここでは、ApplicationActivation属性をActivationOption.Serverとして、このアセンブリをCOM+の実行可能プロセスでアクティブ化することを指定しています。これで、必要なオプションをすべて指定できたので、コンポーネントのコンパイルに進み、アセンブリを生成します。アセンブリを生成できたら、「gacutil.exe」ユーティリティを使ってGACにアセンブリをインストールします。アセンブリをインストールするには、アセンブリの名前とコマンドスイッチiを引数としてgacutilユーティリティに渡します。
gacutil -i ServerApp.dll
GACにアセンブリをインストールできたら、regsvcsユーティリティを実行してCOM+にコンポーネントを登録します。
regsvcs ServerApp.dll
これで、アセンブリを配置できました。クライアントアプリケーションを作成し、配置したアセンブリにあるクラスのメソッドをテストしてみましょう。
サービスコンポーネントのクライアントアプリケーション
まず、「ServerAppClient」という新しいVisual C# Windowsアプリケーションを作成し、「Form1.cs」ファイルに次のコード行を追加します。
using ServerApp; private void cmdServerApp_Click(object sender, System.EventArgs e) { SampleServer obj = new SampleServer(); MessageBox.Show(obj.WriteMessage()); }
アプリケーションを実行してコマンドボタンをクリックすると、サービスコンポーネントから返されたメッセージが表示されます。






