![]() ![]() ![]() ![]() IEで.NET Windowsフォームコントロールをホストするこの記事のURLhttp://japan.internet.com/developer/20051220/25.html
著者:Thiru Thangarathinam
海外internet.com発の記事
はじめに以前は、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フォームコントロールを作成するこのステップでは、「Hello World」メッセージをユーザーに表示する簡単なWindowsフォームコントロールを作成します。まず、次の画面に示すように、Visual C#で「HelloWorldControl」という名前のWindowsコントロールライブラリプロジェクトを作成します。 ![]() プロジェクトを作成できたら、既定のユーザーコントロールを 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> オブジェクトタグの 仮想ディレクトリを構成する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サービスクラスの名前を [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; } <appSettings> <add key="connectionString" value="server=localhost;uid=sa;pwd=thiru;database=Pubs"> </add> </appSettings> 次に、接続文字列を引数として、 Webサービスクライアントとして動作するWindowsフォームコントロールの作成今回のケースでは、WindowsフォームコントロールからWebサービスを呼び出したいので、次の画面に示すように、Visual C#で「AuthorsWebServiceClientControl」という名前のWindowsコントロールライブラリプロジェクトを作成します。 ![]() プロジェクトを作成できたら、既定のユーザーコントロールを 次の画面の[Add Web Reference]ダイアログボックスで、Webサービスの場所を入力し、[Enter]キーを押します。そして、[Add Reference]ボタンをクリックしてWebサービスへの参照を追加します。これは基本的にAuthors Webサービスのプロキシを作成する作業です。 ![]() プロキシを作成できたら、次にWebサービスを呼び出すコードを追加します。これは、先ほど追加したコマンドボタンの 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サービスプロキシクラスのインスタンスを生成してから、 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サービスが呼び出され、 ![]() Windowsフォームコントロールをデバッグするコントロールをデバッグするには、次の手順を実行する必要があります。
![]() ![]() ![]() ![]() コードアクセス許可と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"); } } } 上記のコードでは、 ![]() 上記のダイアログボックスのメッセージから、コントロールのコードが.NETランタイムのコードアクセスセキュリティによって制限されていることがわかります。 Windowsフォームコントロールの利点と制約しかし、IE内でWindowsフォームコントロールを使用する前には、その利点と制約を知っておく必要があります。主な利点には次のものがあります。
制約には次のものがあります。
上記の制約があるため、クライアントマシンの能力を検出してから、クライアントマシンにとって適切なコンテンツを配信するのが有益かもしれません。たとえば、IE内でホストされているフォームコントロールは、クライアントマシン上に.NETランタイムを必要とするので、クライアントマシンに.NETランタイムがインストールされているか調べるコードを書くことができます。これを調べるには、 まとめこの記事では、IE内でWindowsフォームコントロールをホストする方法を論じ、コントロールをデバッグするための手順を説明しました。また、.NETコードアクセスセキュリティを利用して、Internet Explorer内でコントロールが実行できるように構成する方法を説明しました。 この技術はクライアントマシン上にプラットフォーム固有の要素を必要としますが、その一方で多くの期待を抱かせてくれます。特に、Windowsオペレーティングシステムの将来のバージョンに.NET Frameworkが不可欠なものとして組み込まれるであろうことを考えると、その思いは強くなります。Windows Server 2003の最新リリースは、まさにその例です。 最後に、この記事を読んでくださった方に感謝します。また、この記事があなたにとって有益であることを願っています。 著者紹介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。 |