Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。Explorer(IE)内にホストできる、コンパクトで安全性の高いオブジェクトを簡単に作成することができます。本稿では、Windowsフォームコントロールを作成し、IE内にホストする方法を解説します。ポストはじめに以前は、Webアプリケーションでリッチなクライアントサイド機能を提供するために、Web開発者はActiveXコントロールをよく使用していました。Explorer内にホストできるオブジェクトを簡単に作成することができます。Windowsフォームコントロールをホストすることにより、開発者はクライアントサイドWeb開発における多くの目標を達成できます。Explorer内にホストする方法を解説します。IE内でWindowsフォームコントロールを使用し、WindowsフォームコントロールからリモートWebサービスを呼び出すことによって、クライアントサイドでのリッチなユーザー体験を提供する方法も示します。.NETのセキュリティモデルを活用して、コントロールにシームレスで安全性の高い実行環境を提供する方法も解説します。Javaベースの言語でWebアプリケーションを開発したことがある人なら、Javaアプレットについてはよくご存知でしょう。Javaアプレットとは、簡単に言えば、Webブラウザ上で実行するために設計されている、小さなプログラムのことです。Javaアプレットは、ブラウザがアプレットタグの含まれたHTMLドキュメントを読み込むと実行されます。Webページ内のWindowsフォームは、このJavaアプレットと同じような方法で動作します。このアプローチでは、Windowsフォーム技術によって提供されるリッチクラスを使用してWindowsフォームコントロールを作成し、そのコントロールをWebページに組み込みます。ブラウザは、Webページを読み込むと、Windowsフォームコントロール内に含まれるコードも実行します。このことは、エンタープライズ規模のイントラネットまたはエクストラネットアプリケーションを配備する必要があり、ファットクライアントアプリケーションが提供するのと同様の動的でリッチなユーザー体験が必要とされるケースで、非常に役立つ場合があります。このモデルは、シンクライアントn階層アプリケーションと同じ配備および保守性の特性に基づいています。Explorerとのシームレスな統合です。ユーザーを介することなく、IEからWindowsフォームコントロールをアクティブ化できます。CLRが提供するコードアクセスセキュリティのすべての機能は依然として利用できます。Windowsフォームコントロールを作成する際には、Windowsフォームのクラス階層により提供されるすべての機能を利用できます。ユーザーが入力したデータについて広範な検証を行うために、Windowsフォームコントロールの検証技法を使用することができます。同様に、フォームコントロールからリモートWebサービスを呼び出すこともできます。これらすべての技法を使用することにより、.NETプラットフォームを使用して、リッチで強力で動的な最新式のアプリケーションを作成することができます。Explorer内にホストする方法を見ていきます。次のリストは、IE内でWindowsフォームコントロールをアクティブ化するための手順を示したものです。Windowsフォームコントロールを作成するWindowsフォームコントロールを識別するオブジェクトタグを含む、HTMLドキュメントを作成するコントロールを適切にアクティブ化できるように、仮想ディレクトリを構成するコードアクセス許可を構成するコントロールを実行するでは、上記の各ステップを詳しく見ていきましょう。World」メッセージをユーザーに表示する簡単なWindowsフォームコントロールを作成します。C#で「HelloWorldControl」という名前のWindowsコントロールライブラリプロジェクトを作成します。プロジェクトを作成できたら、既定のユーザーコントロールをHelloWorldCtlという名前に変更します。ユーザーコントロールに、lblDisplayMessageという名前のラベルコントロールとbtnClickという名前のボタンを追加します。ユーザーがボタンをクリックしたときは、次のコードを実行して、ユーザーに簡単なメッセージを表示するようにします。World";}コントロールを作成できたら、プロジェクトをコンパイルしてアセンブリを作成します。HTMLページを作成するこのステップでは、HTMLドキュメントを作成し、Windowsフォームコントロールをアクティブ化するために使用するオブジェクトタグを挿入します。HTMLページは次のようになります。VIEWASTEXT></object><br><br></html>オブジェクトタグのclassid属性には、コントロールライブラリアセンブリへのパスとコントロールの完全修飾名を指定します。この完全修飾名は、コントロールクラスの名前だけでなくネームスペースを含むものにします。上記のコードからおわかりのとおり、アセンブリとコントロールの完全修飾名は#記号で区切ります。これら2つのパラメータの組み合わせは、コントロールを識別する一意識別子として働きます。コントロールはHelloWorldControl1という一意の名前によって識別されるので、コントロールに対してクライアントサイドスクリプトを書くことも可能です。仮想ディレクトリを構成するHTMLページを作成できたら、「HelloWorldControlHost」という名前の仮想ディレクトリを作成し、そこにコントロール(「HelloWorldControl.dll」)とHTMLドキュメント(「HelloWorld.htm」)の両方を追加します。only]に設定することが重要です。Executables]に設定されている場合、コントロールは適切にアクティブ化されません。このことは、次の画面に示す仮想ディレクトリのプロパティウィンドウで確認できます。コードアクセス許可を構成するこのコントロールは、イントラネットサイト上にある場合は正しく実行されるでしょう。Explorerを構成するか、セキュリティポリシーを変更する必要があります。そのためには、コントロールをホストしているページを信頼済みサイトゾーンとして設定します。Sites]をクリックします。[Sites]ボタンをクリックし、そのサイトをリストに追加して[OK]をクリックします。これでインターネットアクセス許可を設定したことになるので、次回そのページを閲覧するときからは、適切に実行されるようになります。コントロールを実行するコントロールを実行するには、ブラウザを開き、そのコントロールをホストするHTMLページに移動するだけです。World」メッセージが表示されます。Explorer内にホストする方法については解説したので、次に、Windowsフォームコントロールを使用してクライアントマシンから直接Webサービスにアクセスする方法を解説します。WindowsフォームコントロールからWebサービスにアクセスするWindowsフォームコントロールの主な利点の1つは、クライアントマシンにリッチなユーザー体験を与えられることです。クライアントマシンから直接Webサービスにアクセスし、ページを更新することさえなく、ユーザーに結果を表示することができます。この例を示すために、Webサービスを作成し、WindowsフォームコントロールからそのWebサービスを呼び出す方法を見ていきます。Webサービスを作成します。Webサービスを作成できたら、Webサービスクラスの名前をAuthorsServiceに変更します。その後で、AuthorsServiceクラスにGetAuthorsという名前のメソッドを追加します。GetAuthorsメソッドは次のようになります。dstAuthors;}GetAuthorsメソッドのコードは単純です。最初に、「web.config」ファイルから接続文字列を取得します。接続文字列は、「web.config」ファイルのappSettingsセクションに、次のように記述されています。</add></appSettings>次に、接続文字列を引数として、SqlConnectionオブジェクトのインスタンスを生成します。その後で、実行するクエリとSqlConnectionオブジェクトを引数として、SqlDataAdapterオブジェクトのインスタンスを生成します。それから、SqlDataAdapterオブジェクトのFillメソッドを呼び出すことで、実行したクエリの結果をDataSetに格納します。最後に、すべてのリソースを解放し、Webサービスの呼び出し元にDataSetを戻します。これでWebサービスは作成できたので、次にWebサービスのクライアントアプリケーションを作成します。C#で「AuthorsWebServiceClientControl」という名前のWindowsコントロールライブラリプロジェクトを作成します。プロジェクトを作成できたら、既定のユーザーコントロールをAuthorsControlという名前に変更します。ユーザーコントロールに、gridAuthorsという名前のDataGridとbtnClickという名前のコマンドボタンを追加します。コマンドボタンのClickイベントに、Webサービスを呼び出すコードを記述します。Reference]オプションを使用して、Webサービスへの参照を追加します。Reference]ダイアログボックスで、Webサービスの場所を入力し、[Enter]キーを押します。Reference]ボタンをクリックしてWebサービスへの参照を追加します。Webサービスのプロキシを作成する作業です。プロキシを作成できたら、次にWebサービスを呼び出すコードを追加します。これは、先ほど追加したコマンドボタンのClickイベントに対して行います。Cursors.Default;}上記のコードでは、Webサービスプロキシクラスのインスタンスを生成してから、GetAuthorsメソッドを呼び出しています。DataGridコントロールのDataSourceプロパティに、Webサービスから戻されるDataSetを設定します。ここでプロジェクトをコンパイルしてアセンブリを作成しましょう。このアセンブリを仮想ディレクトリに配置することができます。HTMLページと仮想ディレクトリの作成このステップでは、先ほど作成したAuthorsWebServiceClientControlをホストするHTMLページを作成します。HTMLページのコードは次のようになります。VIEWASTEXT></object><br><br></html>HTMLページを作成できたら、次に、コントロールだけでなくHTMLページをホストするのに使用できる仮想ディレクトリを作成する必要があります。仮想ディレクトリを作成できたら、HTMLページとコントロールを、仮想ディレクトリに対応付けられた物理フォルダにコピーします。これで、先ほど作成したHTMLページに移動すれば、コントロールをテストすることができます。HTMLページには、フォームコントロールの部品として1つのコマンドボタンがあります。このコマンドボタンをクリックすると、クライアントブラウザからWebサービスが呼び出され、DataGridにWebサービスの実行結果が表示されます。HTMLページからの出力は、次の画面のとおりです。Windowsフォームコントロールをデバッグするコントロールをデバッグするには、次の手順を実行する必要があります。ブラウザを開き、HTMLページにリクエストを送ります。Processes]を選択して、次の画面のダイアログボックスを開きます。[Processes]ダイアログボックスで、[IEXPLORE.EXE]を選択し、[Attach]ボタンをクリックします。[Attach]ボタンをクリックすると、次の画面のダイアログボックスが開き、デバッグしたいプログラムの種類を選択するよう求められます。Runtime]がチェックされていることを確認し、[OK]をクリックします。上記のダイアログボックスで[OK]をクリックすると、[Processes]ダイアログボックスに戻ります。[Close]ボタンをクリックします。[File]メニューから[Open]-[File]を選択して、ユーザーコントロールファイル「AuthorsWebServiceClientControl.cs」を開きます。コマンドボタンのClickイベント内でブレークポイントを設定します。ブラウザに戻り、コマンドボタンをクリックします。すると、次の画面に示すように、コントロールに設定したブレークポイントで自動的に実行が停止されるはずです。.NETのすべての機能を使用してコードをデバッグすることができます。コードアクセス許可とWindowsフォームコントロール前述のとおり、IE内でコントロールを実行するとき、コントロールは.NETランタイムが提供するコードアクセス許可を利用します。IE内で実行されるフォームコントロールに、.NETランタイムが提供するコードアクセス許可がどのように働くかを理解するために、Authorsフォームコントロールに数行のコードを追加し、新しいイベントログソースを作成します。修正後のコントロールのLoadイベントは次のようになります。}}上記のコードでは、TestSourceという名前のEventLogソースの存在を確認しています。イベントソースが存在しない場合は作成し、そうでない場合は既存のイベントソースを削除し、新しいイベントソースを一から作成します。予想が付くことと思いますが、この種の操作を行うには、より多くの特権が必要とされます。そのため、インターネットからダウンロードされたコントロールに、この種の操作を許可してはなりません。これを実際に確認するには、コントロールの出力を仮想ディレクトリにコピーします。コントロールの出力を仮想ディレクトリにコピーした後で、ブラウザでコントロールをホストするHTMLページに移動すると、次の画面のダイアログボックスが開きます。上記のダイアログボックスのメッセージから、コントロールのコードが.NETランタイムのコードアクセスセキュリティによって制限されていることがわかります。Windowsフォームコントロールの利点と制約しかし、IE内でWindowsフォームコントロールを使用する前には、その利点と制約を知っておく必要があります。主な利点には次のものがあります。Webを通して動的でリッチなユーザー体験を提供することができるクライアント上にコンパイル済みコードが自動的にキャッシュされる.NETのコードアクセスセキュリティとのシームレスな統合により、クライアントサイドから.NETのセキュリティモデルを利用できるJavaアプレットのパフォーマンスが向上する制約には次のものがあります。上記の制約があるため、クライアントマシンの能力を検出してから、クライアントマシンにとって適切なコンテンツを配信するのが有益かもしれません。IE内でホストされているフォームコントロールは、クライアントマシン上に.NETランタイムを必要とするので、クライアントマシンに.NETランタイムがインストールされているか調べるコードを書くことができます。これを調べるには、Request.Browser.ClrVersionプロパティの値をチェックします。このプロパティは、クライアントマシンに.NETがインストールされていればバージョン番号を戻し、インストールされていなければ0.0を戻します。まとめこの記事では、IE内でWindowsフォームコントロールをホストする方法を論じ、コントロールをデバッグするための手順を説明しました。Explorer内でコントロールが実行できるように構成する方法を説明しました。この技術はクライアントマシン上にプラットフォーム固有の要素を必要としますが、その一方で多くの期待を抱かせてくれます。Frameworkが不可欠なものとして組み込まれるであろうことを考えると、その思いは強くなります。2003の最新リリースは、まさにその例です。最後に、この記事を読んでくださった方に感謝します。この記事があなたにとって有益であることを願っています。1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。実装に関して約6年の経験を持つ。ソフトウェアライフサイクル(設計、開発およびテスト)にも精通。プラットフォームチームの意義と実践のポイント1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。プラットフォームチームの意義と実践のポイント1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。プラットフォームチームの意義と実践のポイント1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW新着記事一覧を見るイベント今後の予定を見るCodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。