![]() ![]() ![]() ![]() サービスコンポーネントのさまざまな配置方法この記事のURLhttp://japan.internet.com/developer/20060502/26.html
著者:Thiru Thangarathinam
海外internet.com発の記事
はじめにインターネットは数多くのネットワークアプリケーションが接続されることで成り立っていますが、このインターネットの世界で、Webサイトを訪れる数百万人のユーザーの要求に応えるべくWebアプリケーションをスケーラブルにしたいと思うのは当然のことです。COM+は、スケーラブルで、拡張性があり、保守可能な分散アプリケーションを作成するためのWindows DNA 2000アーキテクチャの中核要素です。ただし、.NETでは、COM+コンポーネントのことを「サービスコンポーネント」と呼んでいます。.NET戦略のたび重なる変更により、サービスコンポーネントの配置モデルは、従来のCOM+コンポーネントの配置方法とは異なっています。この記事では、.NET Frameworkに用意されている各種ツールを使ってサービスコンポーネントを配置する方法を学習します。また、配置モデルがサービスコンポーネントのタイプによってどう変わるかについても説明します。最後に、Windowsインストーラプロジェクトを使ってサービスコンポーネントの配置を自動化する方法を学習します。 Windows 2000のコンポーネントサービスは、エンタープライズアプリケーションのための機能を豊富に備えており、Web対応の分散アプリケーション開発に必要なすべての基本機能を提供します。COM+サービスはもともとCOMコンポーネントで使うために設計されたものですが、COM+ランタイムが提供するサービスは、オブジェクトプーリング、データベース接続プーリング、リソース共有、ロールベースセキュリティ、分散トランザクション処理の監視など、有益なものが多いので、.NETコンポーネントでも利用できれば便利です。 .NET Frameworkには、COM+サービスをアプリケーションに提供するために必要なすべてのクラスを含んだSystem.EnterpriseServicesという名前空間があります。COM+の概要については、TechNetの「Introduction to COM and COM+」を参照してください。 サービスコンポーネントのさまざまな配置方法の説明に入る前に、System.EnterpriseServices名前空間にある最も重要なクラスの1つ、 ServicedComponent COM+サービスを利用する サービスコンポーネントのさまざまな配置方法COMコンポーネントをコンパイルすると、そのコンポーネントをCOM+にインストールするために必要な全情報を含んだタイプライブラリが作成されます。一方、.NETコンポーネントをコンパイルすると、マニフェスト、MSIL、メタデータなどを含んだアセンブリが作成されます。アセンブリは、タイプライブラリとはまったく異なるものです。そのため、アセンブリからタイプライブラリを作成し、アセンブリをCOM+にシームレスにインストールできるようする必要があります。 Windows 2000のコンポーネントサービスに.NETコンポーネントを配置するには、次の3とおりの方法があります。
Regsvcsコマンドラインユーティリティは、アセンブリの名前を入力として受け取り、そのアセンブリを読み取ってタイプライブラリを作成した後、オブジェクトをCOM+に登録します。
実行時に、共通言語ランライム(CLR)はアセンブリに基づいてタイプライブラリを自動的に作成し、COM+はそのタイプライブラリにある情報を使ってオブジェクトをインストールします。この方法は「レイジー登録」(lazy registration)と呼ばれ、ライブラリアプリケーションでしか利用できません。
RegistrationHelperクラスのInstallAssemblyメソッドを使って、コードからCOM+に.NETオブジェクトを登録することができます。アセンブリは、COM+に配置するだけでなく、次のいずれかの場所にも配置しなければなりません。
クライアントが[Add Reference]ダイアログボックスを使ってサービスコンポーネントアセンブリを参照する場合は、ここがアセンブリの既定の配置場所になります。
コンピュータ上のすべてのクライアントがアセンブリを利用できるようになります。
ライブラリアプリケーションにサービスコンポーネントを配置する場合は1つ目の配置方法(プライベート配置)を検討し、サーバーアプリケーションにサービスコンポーネントを配置する場合は2つ目の配置方法(GACに配置)を検討します。 サービスコンポーネントを使う前に、アセンブリに厳密に署名するためのキーファイルが必要です。キーファイルを生成するには、まず-kスイッチを使ってsn.exe(厳密名ユーティリティ)を実行します。この結果、公開/秘密キーのペアを含むファイルが作成されます。次に、公開/秘密キーのペアでアセンブリに署名し、「Assemblyinfo.cs」ファイルに では、COM+ライブラリアプリケーションにサービスコンポーネントを配置する方法の説明から始めましょう。 ライブラリアプリケーションにサービスコンポーネントを配置するまず、Visual Studio .NETで[File]メニューの[New Project]を選択して新しいプロジェクトを作成します。次の画面に示すように、[New Project]ダイアログボックスで、プロジェクトの種類としてVisual C#クラスライブラリを選択し、プロジェクトの名前として「LibraryApp」と入力します。 プロジェクトを作成できたら、既定クラス(Class1)の名前を「SampleLibrary」に変更し、次のように修正します。COM+に用意されているサービスを利用するために、 public class SampleLibrary : ServicedComponent { public SampleLibrary() { } public string WriteMessage() { return "This message is from a library application"; } } ここでは、文字列を返す 次に、snユーティリティを使ってキーファイルを生成します。キーファイルを生成するには、Visual Studio .NETコマンドプロンプトで次のコマンドを入力します。 キーファイルを生成できたら、そのキーファイルをプロジェクトに追加します。さらに、「AssemblyInfo.cs」ファイルに次の行を追加します。 [assembly: AssemblyKeyFile("....LibraryApp.snk")] [assembly: ApplicationName("LibraryApp")] [assembly: ApplicationActivation(ActivationOption.Library)] [assembly: Description("This is a library application")] このコードについて詳しく説明しましょう。
COM+アプリケーションを作成する場合に使う名前を指定します。
サービスコンポーネントをアクティブ化する方法(インプロセスまたはアウトオブプロセス)を指定します。ここでは、値
ActivationOption.Libraryを指定して、サービスプロセスをクライアントのプロセス空間でアクティブ化することを指定しています。アセンブリの説明を入力します。
サービスコンポーネントをコンパイルしたら、COM+にアセンブリを配置する必要があります。配置するには、コマンドラインから次のようにサービスインストールユーティリティ「regsvcs.exe」を実行します。 regsvcs LibraryApp.dll このコマンドラインユーティリティを実行すると、基本的に次の処理が行われます。
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")] ここでは、 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()); } アプリケーションを実行してコマンドボタンをクリックすると、サービスコンポーネントから返されたメッセージが表示されます。 System.EnterpriseServices.RegistrationHelperクラスを使って配置を自動化するこれらの手動の配置方法は、サイズが小さいアプリケーションにしか利用できません。例えば、ターゲットサーバーにインストールするために複雑なインストールプログラムを必要とする、エンタープライズアプリケーション内でサービスコンポーネントを使用する場合は、そのサービスコンポーネントの配置を、インストールプログラムの一部として行う必要があります。また、アセンブリをGACにインストールする処理をインストールプログラムの一部として行うことが必要になる場合もあります。このようなインストールを実行するスクリプトやバッチファイルを作成することもできますが、もっと簡単な方法があります。Visual Studio .NET のセットアップ/配置プロジェクトを使用すると、コンポーネント登録用のコードを呼び出す機能や、インストール時またはアンインストール時にその他の必要な処理を実行する機能を備えたセットアッププロジェクトを簡単に作成できます。このためには、インストール時またはアンインストール時に実行するカスタム動作を作成する必要があります。カスタム動作を作成するために必要な作業は、System.Configuration.Install.Installerを継承するクラスをアセンブリ内で作成し、配置プロジェクトにカスタムのインストール動作を追加することだけです。今回の例では、先ほど作成したLibraryAppサービスコンポーネントを使うことにします。 LibraryAppサービスコンポーネントアセンブリにインストーラクラスを追加するには、次のようにします。
クラスを作成できたら、そのクラスに public override void Install( System.Collections.IDictionary stateSaver) { try { string appID = null; string typeLib = null; // Get the location of the current assembly string assembly = GetType().Assembly.Location; // Install the application RegistrationHelper regHelper = new RegistrationHelper (); regHelper.InstallAssembly (assembly, ref appID, ref typeLib, InstallationFlags.FindOrCreateTargetApplication); // Save the state - you will need this for the uninstall stateSaver.Add ("AppID", appID); stateSaver.Add ("Assembly", assembly); } catch(Exception ex) { #if DEBUG Debug.WriteLine (ex); #endif StreamWriter writer = File.AppendText ("InstallError.log"); writer.WriteLine ("Uninstall Error: {0}", ex.Message); // If the installer catches the exception it will display // an error message. Show a friendly error message throw new ApplicationException ( "Error installing the middle tier", ex); } } public override void Uninstall( System.Collections.IDictionary savedState) { try { // Get the state created when the app was installed string appID = (string)savedState["AppID"]; string assembly = (string)savedState["Assembly"]; // Uninstall the application RegistrationHelper regHelper = new RegistrationHelper (); regHelper.UninstallAssembly (assembly, appID); } catch ( Exception ex) { // Don’t allow unhandled exceptions during uninstall #if DEBUG Debug.WriteLine (ex); #endif StreamWriter sw = File.AppendText ("InstallError.log"); sw.WriteLine ("Uninstall Error: {0}", ex.Message); } } このコード行について詳しく説明しましょう。まず、現在使用しているアセンブリの場所の参照を取得します。
string assembly = GetType().Assembly.Location;
ここで、
RegistrationHelper regHelper = new RegistrationHelper ();
その後、 regHelper.InstallAssembly (assembly, ref appID, ref typeLib, InstallationFlags.FindOrCreateTargetApplication); 次に、用意されているコレクションオブジェクトに
stateSaver.Add ("AppID", appID);
stateSaver.Add ("Assembly", assembly);
}
このコード行の実行時に例外が発生した場合は、その例外をキャッチし、例外情報をログファイル「InstallError.log」に書き込みます。
catch(Exception ex)
{
#if DEBUG
Debug.WriteLine (ex);
#endif
StreamWriter writer = File.AppendText ("InstallError.log");
writer.WriteLine ("Uninstall Error: {0}", ex.Message);
// If the installer catches the exception it will display
// an error message. Show a friendly error message
throw new ApplicationException
(
"Error installing the middle tier", ex);
}
}
// Get the state created when the app was installed string appID = (string)savedState["AppID"]; string assembly = (string)savedState["Assembly"]; 次に、
RegistrationHelper regHelper = new RegistrationHelper ();
regHelper.UninstallAssembly (assembly, appID);
}
ここで再び、例外ブロックで、例外情報を外部のログファイル「InstallError.log」に書き込みます。
catch ( Exception ex)
{
// Don’t allow unhandled exceptions during uninstall
#if DEBUG
Debug.WriteLine (ex);
#endif
StreamWriter sw = File.AppendText ("InstallError.log");
sw.WriteLine ("Uninstall Error: {0}", ex.Message);
}
}
インストーラクラスを作成できたら、 次に、配置プロジェクトにLibraryAppプロジェクトの出力を追加する必要があります。このためには、LibraryAppSetupプロジェクトを右クリックし、[Add]をポイントして[Project Output]を選択します。[Add Project Output Group]ダイアログボックスの[project]ドロップダウンボックスから[LibraryApp]を選択し、出力リストから[Primary Output]を選択します。次に、インストーラが カスタム動作を追加する カスタム動作はインストールのさまざまなフェーズで呼び出すことができます。インストールが終了した後またはロールバックされた後は、コミットフェーズとロールバックフェーズが発生します。コミットフェーズとロールバックフェーズの際に重要な作業を実行してはなりません。 カスタム動作を追加するには、次のようにします。
GACにアセンブリを配置するインストールの一部として、GACにサービスコンポーネントを配置することもできます。これは、COM+サーバーアプリケーションにサービスコンポーネントを配置する場合に非常に便利です。GACにサービスコンポーネントをインストールするには、次の操作を実行します。
これで、インストーラを作成して「LibraryAppSetup.msi」ファイルを実行すると、アセンブリがコンポーネントサービスに登録されているだけでなく、GACにも配置されていることが分かります。 XCOPY配置とサービスコンポーネント.NET Frameworkの目標の1つは、XCOPY配置をサポートすることによってシステムのインストールを簡略化することです。XCOPYとは、ファイルやディレクトリを別の場所にコピーするためのMS-DOSコマンドラインユーティリティのことです。XCOPY配置の目的は、コードを実行することなくアプリケーションをリモートサーバーにインストールできるようにすることです。XCOPY配置をサポートするために、CLR/COM+の統合アーキテクチャでは、インストール時に「regsvcs.exe」の実行を無視し、サービスコンポーネントが初めて使用されるときに自動登録を行うような仕組みが用意されています。これを「レイジー登録」と言います。レイジー登録は、ライブラリアプリケーションにサービスコンポーネントを配置する場合に役立ちます。ただし、XCOPY配置にも注意しなければならない欠点があります。
GACにサービスコンポーネントをインストールすることが必要な場合次の条件に当てはまる場合は、GACにサービスコンポーネントをインストールすることが必要です。
まとめこの記事では、.NET Frameworkに用意されているさまざまなクラスやツールを使ってサービスコンポーネントを配置する方法を説明しました。また、Windowsインストーラテクノロジを利用すると、サービスコンポーネントの配置を自動化するWindowsインストーラプロジェクトを簡単に作成できることも説明しました。 最後に、この記事を読んでくださった方に感謝します。また、この記事があなたにとって有益であることを願っています。 著者紹介Thiru Thangarathinam(Thiru Thangarathinam)
オブジェクト指向アプリケーション開発方法論を用いたアプリケーションのアーキテクチャ設計、設計、開発、および実装に関して約6年の経験を持つ。ソフトウェアライフサイクル(設計、開発およびテスト)にも精通。
ASP.NET、.NET Framework、Visual C#.NET、Visual Basic.NET、ADO.NET、XML Webサービス、および.NET Remotingのエキスパートであり、MCAD(.NETトラック)、MCSD、およびMCP資格を保有。 多くの書籍や記事を執筆。メールの宛先はthiruthangarathinam@yahoo.com。 |