はじめに
以前は、Webアプリケーションでリッチなクライアントサイド機能を提供するために、Web開発者はActiveXコントロールをよく使用していました。現在は、Microsoft .NET Frameworkを使用して、よりコンパクトで軽量、かつ安全性の高い、Internet Explorer内にホストできるオブジェクトを簡単に作成することができます。IE内に.NET Windowsフォームコントロールをホストすることにより、開発者はクライアントサイドWeb開発における多くの目標を達成できます。この記事では、Windowsフォームコントロールを作成し、Internet Explorer内にホストする方法を解説します。また、IE内でWindowsフォームコントロールを使用し、WindowsフォームコントロールからリモートWebサービスを呼び出すことによって、クライアントサイドでのリッチなユーザー体験を提供する方法も示します。さらに、.NETのセキュリティモデルを活用して、コントロールにシームレスで安全性の高い実行環境を提供する方法も解説します。
Javaベースの言語でWebアプリケーションを開発したことがある人なら、Javaアプレットについてはよくご存知でしょう。Javaアプレットとは、簡単に言えば、Webブラウザ上で実行するために設計されている、小さなプログラムのことです。Javaアプレットは、ブラウザがアプレットタグの含まれたHTMLドキュメントを読み込むと実行されます。Webページ内のWindowsフォームは、このJavaアプレットと同じような方法で動作します。このアプローチでは、Windowsフォーム技術によって提供されるリッチクラスを使用してWindowsフォームコントロールを作成し、そのコントロールをWebページに組み込みます。ブラウザは、Webページを読み込むと、Windowsフォームコントロール内に含まれるコードも実行します。このことは、エンタープライズ規模のイントラネットまたはエクストラネットアプリケーションを配備する必要があり、ファットクライアントアプリケーションが提供するのと同様の動的でリッチなユーザー体験が必要とされるケースで、非常に役立つ場合があります。このモデルは、シンクライアントn階層アプリケーションと同じ配備および保守性の特性に基づいています。
.NETの大きな特徴の1つは、Internet Explorerとのシームレスな統合です。たとえば、ユーザーを介することなく、IEからWindowsフォームコントロールをアクティブ化できます。これには何の登録作業も必要なく、.NET CLRが提供するコードアクセスセキュリティのすべての機能は依然として利用できます。
Windowsフォームコントロールを作成する際には、Windowsフォームのクラス階層により提供されるすべての機能を利用できます。たとえば、ユーザーが入力したデータについて広範な検証を行うために、Windowsフォームコントロールの検証技法を使用することができます。同様に、フォームコントロールからリモートWebサービスを呼び出すこともできます。これらすべての技法を使用することにより、.NETプラットフォームを使用して、リッチで強力で動的な最新式のアプリケーションを作成することができます。
実装
ここでは、簡単なWindowsフォームコントロールを作成し、Internet Explorer内にホストする方法を見ていきます。次のリストは、IE内でWindowsフォームコントロールをアクティブ化するための手順を示したものです。
- Windowsフォームコントロールを作成する
- Windowsフォームコントロールを識別するオブジェクトタグを含む、HTMLドキュメントを作成する
- コントロールを適切にアクティブ化できるように、仮想ディレクトリを構成する
- コードアクセス許可を構成する
- コントロールを実行する
では、上記の各ステップを詳しく見ていきましょう。
Windowsフォームコントロールを作成する
このステップでは、「Hello World」メッセージをユーザーに表示する簡単なWindowsフォームコントロールを作成します。まず、次の画面に示すように、Visual C#で「HelloWorldControl」という名前のWindowsコントロールライブラリプロジェクトを作成します。

プロジェクトを作成できたら、既定のユーザーコントロールをHelloWorldCtl
という名前に変更します。ユーザーコントロールに、lblDisplayMessage
という名前のラベルコントロールとbtnClick
という名前のボタンを追加します。ユーザーがボタンをクリックしたときは、次のコードを実行して、ユーザーに簡単なメッセージを表示するようにします。
private void btnClick_Click(object sender, System.EventArgs e) { lblDisplayMessage.Text = "Hello World"; }
コントロールを作成できたら、プロジェクトをコンパイルしてアセンブリを作成します。
HTMLページを作成する
このステップでは、HTMLドキュメントを作成し、Windowsフォームコントロールをアクティブ化するために使用するオブジェクトタグを挿入します。HTMLページは次のようになります。
<html> <body> <p>Hello World Control<br> <br></body> <object id="HelloWorldControl1" classid="http:HelloWorldControl.dll#HelloWorldControl.HelloWorldCtl" height="500" width="500" VIEWASTEXT> </object> <br><br> </html>
オブジェクトタグのclassid
属性には、コントロールライブラリアセンブリへのパスとコントロールの完全修飾名を指定します。この完全修飾名は、コントロールクラスの名前だけでなくネームスペースを含むものにします。上記のコードからおわかりのとおり、アセンブリとコントロールの完全修飾名は#記号で区切ります。これら2つのパラメータの組み合わせは、コントロールを識別する一意識別子として働きます。コントロールはHelloWorldControl1
という一意の名前によって識別されるので、コントロールに対してクライアントサイドスクリプトを書くことも可能です。
仮想ディレクトリを構成する
HTMLページを作成できたら、「HelloWorldControlHost」という名前の仮想ディレクトリを作成し、そこにコントロール(「HelloWorldControl.dll」)とHTMLドキュメント(「HelloWorld.htm」)の両方を追加します。仮想ディレクトリの構成においては、仮想ディレクトリの実行アクセス権を[Scripts only]に設定することが重要です。実行アクセス権が[Scripts & Executables]に設定されている場合、コントロールは適切にアクティブ化されません。このことは、次の画面に示す仮想ディレクトリのプロパティウィンドウで確認できます。

コードアクセス許可を構成する
このコントロールは、イントラネットサイト上にある場合は正しく実行されるでしょう。しかし、インターネットサイト上にあるコントロールを実行したい場合は、実行を許可するようにInternet Explorerを構成するか、セキュリティポリシーを変更する必要があります。そのためには、コントロールをホストしているページを信頼済みサイトゾーンとして設定します。目的のサイトを信頼済みサイトゾーンとして設定するには、IEの[Tools]メニューから[Options]を選択し、[Security]タブで[Trusted Sites]をクリックします。そして、[Sites]ボタンをクリックし、そのサイトをリストに追加して[OK]をクリックします。これでインターネットアクセス許可を設定したことになるので、次回そのページを閲覧するときからは、適切に実行されるようになります。
コントロールを実行する
コントロールを実行するには、ブラウザを開き、そのコントロールをホストするHTMLページに移動するだけです。表示されたHTMLページの[Click Here]コマンドボタンをクリックすると、次の画面に示すように「Hello World」メッセージが表示されます。

簡単なWindowsフォームコントロールを作成し、それをInternet Explorer内にホストする方法については解説したので、次に、Windowsフォームコントロールを使用してクライアントマシンから直接Webサービスにアクセスする方法を解説します。
WindowsフォームコントロールからWebサービスにアクセスする
Windowsフォームコントロールの主な利点の1つは、クライアントマシンにリッチなユーザー体験を与えられることです。たとえば、クライアントマシンから直接Webサービスにアクセスし、ページを更新することさえなく、ユーザーに結果を表示することができます。この例を示すために、Webサービスを作成し、WindowsフォームコントロールからそのWebサービスを呼び出す方法を見ていきます。
Webサービスの作成
まず、次の画面に示すように、Visual C#で「AuthorsWebService」という名前のASP.NET Webサービスを作成します。

Webサービスを作成できたら、Webサービスクラスの名前をAuthorsService
に変更します。その後で、AuthorsService
クラスにGetAuthors
という名前のメソッドを追加します。GetAuthors
メソッドは次のようになります。
[WebMethod] public DataSet GetAuthors() { //Get the connection string from the configuration file string connString = System.Configuration.ConfigurationSettings.AppSettings["connectionString"]; SqlConnection sqlConn = new SqlConnection(connString); DataSet dstAuthors = new DataSet("Authors"); SqlDataAdapter adapter = new SqlDataAdapter("Select * from Authors",sqlConn); //Fill the Dataset with the results of the executed query adapter.Fill(dstAuthors,"Author"); //Close and dispose the opened database connection sqlConn.Close(); sqlConn.Dispose(); //Return the Authors Dataset to the caller return dstAuthors; }
GetAuthors
メソッドのコードは単純です。まず最初に、「web.config」ファイルから接続文字列を取得します。接続文字列は、「web.config」ファイルのappSettings
セクションに、次のように記述されています。
<appSettings> <add key="connectionString" value="server=localhost;uid=sa;pwd=thiru;database=Pubs"> </add> </appSettings>
次に、接続文字列を引数として、SqlConnection
オブジェクトのインスタンスを生成します。その後で、実行するクエリとSqlConnection
オブジェクトを引数として、SqlDataAdapter
オブジェクトのインスタンスを生成します。それから、SqlDataAdapter
オブジェクトのFill
メソッドを呼び出すことで、実行したクエリの結果をDataSet
に格納します。最後に、すべてのリソースを解放し、Webサービスの呼び出し元にDataSet
を戻します。これでWebサービスは作成できたので、次にWebサービスのクライアントアプリケーションを作成します。
Webサービスクライアントとして動作するWindowsフォームコントロールの作成
今回のケースでは、WindowsフォームコントロールからWebサービスを呼び出したいので、次の画面に示すように、Visual C#で「AuthorsWebServiceClientControl」という名前のWindowsコントロールライブラリプロジェクトを作成します。

プロジェクトを作成できたら、既定のユーザーコントロールをAuthorsControl
という名前に変更します。ユーザーコントロールに、gridAuthors
という名前のDataGrid
とbtnClick
という名前のコマンドボタンを追加します。コマンドボタンのClick
イベントに、Webサービスを呼び出すコードを記述します。その前に、Visual Studio .NETの[Add Web Reference]オプションを使用して、Webサービスへの参照を追加します。
次の画面の[Add Web Reference]ダイアログボックスで、Webサービスの場所を入力し、[Enter]キーを押します。そして、[Add Reference]ボタンをクリックしてWebサービスへの参照を追加します。これは基本的にAuthors Webサービスのプロキシを作成する作業です。

プロキシを作成できたら、次にWebサービスを呼び出すコードを追加します。これは、先ほど追加したコマンドボタンのClick
イベントに対して行います。
private void btnClick_Click(object sender, System.EventArgs e) { this.Cursor = Cursors.WaitCursor; AuthorsWebServiceProxy.AuthorsService authorsSvc = new AuthorsWebServiceProxy.AuthorsService(); gridAuthors.DataSource = authorsSvc.GetAuthors(); this.Cursor = Cursors.Default; }
上記のコードでは、Webサービスプロキシクラスのインスタンスを生成してから、GetAuthors
メソッドを呼び出しています。DataGrid
コントロールのDataSource
プロパティに、Webサービスから戻されるDataSet
を設定します。さて、ここでプロジェクトをコンパイルしてアセンブリを作成しましょう。このアセンブリを仮想ディレクトリに配置することができます。
HTMLページと仮想ディレクトリの作成
このステップでは、先ほど作成したAuthorsWebServiceClientControl
をホストするHTMLページを作成します。HTMLページのコードは次のようになります。
<html> <body> <p>Authors Display Control<br> <br></body> <object id="AuthorsControl1" classid="http:AuthorsWebServiceClientControl.dll#AuthorsWebServiceClientControl.AuthorsControl" height="500" width="500" VIEWASTEXT> </object> <br><br> </html>
HTMLページを作成できたら、次に、コントロールだけでなくHTMLページをホストするのに使用できる仮想ディレクトリを作成する必要があります。仮想ディレクトリを作成できたら、HTMLページとコントロールを、仮想ディレクトリに対応付けられた物理フォルダにコピーします。これで、先ほど作成したHTMLページに移動すれば、コントロールをテストすることができます。HTMLページには、フォームコントロールの部品として1つのコマンドボタンがあります。このコマンドボタンをクリックすると、クライアントブラウザからWebサービスが呼び出され、DataGrid
にWebサービスの実行結果が表示されます。HTMLページからの出力は、次の画面のとおりです。

Windowsフォームコントロールをデバッグする
コントロールをデバッグするには、次の手順を実行する必要があります。
- ブラウザを開き、HTMLページにリクエストを送ります。
- Visual Studio.NETを起動し、[Tools]メニューの[Debug Processes]を選択して、次の画面のダイアログボックスを開きます。
- [Processes]ダイアログボックスで、[IEXPLORE.EXE]を選択し、[Attach]ボタンをクリックします。[Attach]ボタンをクリックすると、次の画面のダイアログボックスが開き、デバッグしたいプログラムの種類を選択するよう求められます。このダイアログボックスで、[Common Language Runtime]がチェックされていることを確認し、[OK]をクリックします。
- 上記のダイアログボックスで[OK]をクリックすると、[Processes]ダイアログボックスに戻ります。[Close]ボタンをクリックします。
- [File]メニューから[Open]-[File]を選択して、ユーザーコントロールファイル「AuthorsWebServiceClientControl.cs」を開きます。コマンドボタンの
Click
イベント内でブレークポイントを設定します。 - ブラウザに戻り、コマンドボタンをクリックします。すると、次の画面に示すように、コントロールに設定したブレークポイントで自動的に実行が停止されるはずです。ブレークポイントで停止したら、Visual Studio .NETのすべての機能を使用してコードをデバッグすることができます。




コードアクセス許可とWindowsフォームコントロール
前述のとおり、IE内でコントロールを実行するとき、コントロールは.NETランタイムが提供するコードアクセス許可を利用します。IE内で実行されるフォームコントロールに、.NETランタイムが提供するコードアクセス許可がどのように働くかを理解するために、Authorsフォームコントロールに数行のコードを追加し、新しいイベントログソースを作成します。修正後のコントロールのLoadイベントは次のようになります。
private void AuthorsControl_Load(object sender, System.EventArgs e) { if (!EventLog.SourceExists("TestSource")) EventLog.CreateEventSource("TestSource", "TestLog"); else { EventLog.DeleteEventSource("TestSource"); EventLog.CreateEventSource("TestSource", "TestLog"); } } }
上記のコードでは、TestSource
という名前のEventLog
ソースの存在を確認しています。イベントソースが存在しない場合は作成し、そうでない場合は既存のイベントソースを削除し、新しいイベントソースを一から作成します。予想が付くことと思いますが、この種の操作を行うには、より多くの特権が必要とされます。そのため、インターネットからダウンロードされたコントロールに、この種の操作を許可してはなりません。これを実際に確認するには、コントロールの出力を仮想ディレクトリにコピーします。コントロールの出力を仮想ディレクトリにコピーした後で、ブラウザでコントロールをホストするHTMLページに移動すると、次の画面のダイアログボックスが開きます。

上記のダイアログボックスのメッセージから、コントロールのコードが.NETランタイムのコードアクセスセキュリティによって制限されていることがわかります。
Windowsフォームコントロールの利点と制約
しかし、IE内でWindowsフォームコントロールを使用する前には、その利点と制約を知っておく必要があります。主な利点には次のものがあります。
- Webを通して動的でリッチなユーザー体験を提供することができる
- クライアント上にコンパイル済みコードが自動的にキャッシュされる
- .NETのコードアクセスセキュリティとのシームレスな統合により、クライアントサイドから.NETのセキュリティモデルを利用できる
- Javaアプレットのパフォーマンスが向上する
制約には次のものがあります。
- クライアントサイドにWindowsオペレーティングシステムが必要
- このタイプのホスティングをサポートするブラウザはInternet Explorer 6.0だけである
- クライアントマシンに.NETランタイムがインストールされている必要がある
- サーバーサイドにWindows 2000とIIS 5.0またはそれ以上が必要
上記の制約があるため、クライアントマシンの能力を検出してから、クライアントマシンにとって適切なコンテンツを配信するのが有益かもしれません。たとえば、IE内でホストされているフォームコントロールは、クライアントマシン上に.NETランタイムを必要とするので、クライアントマシンに.NETランタイムがインストールされているか調べるコードを書くことができます。これを調べるには、Request.Browser.ClrVersion
プロパティの値をチェックします。このプロパティは、クライアントマシンに.NETがインストールされていればバージョン番号を戻し、インストールされていなければ0.0を戻します。
まとめ
この記事では、IE内でWindowsフォームコントロールをホストする方法を論じ、コントロールをデバッグするための手順を説明しました。また、.NETコードアクセスセキュリティを利用して、Internet Explorer内でコントロールが実行できるように構成する方法を説明しました。
この技術はクライアントマシン上にプラットフォーム固有の要素を必要としますが、その一方で多くの期待を抱かせてくれます。特に、Windowsオペレーティングシステムの将来のバージョンに.NET Frameworkが不可欠なものとして組み込まれるであろうことを考えると、その思いは強くなります。Windows Server 2003の最新リリースは、まさにその例です。
最後に、この記事を読んでくださった方に感謝します。また、この記事があなたにとって有益であることを願っています。