WebRole.csの修正
スタートアップタスクの構成に引き続き、ランタイムの構成を行います。ランタイムの権限昇格によってWebRoleクラスは管理者権限で実行されます。
Webロールにおいて、Webアプリケーションが実行されるアプリケーションプールは64bitで構成されています。このままでは、32bitのCOMコンポーネントを呼び出すことはできないため、アプリケーションプールを32bitで再構成します。この処理は、WebRoleのOnStartメソッドで行います。
Webロールのコンテキストメニューからから[参照の追加]を選択し、Microsoft.Web.Administrationへの参照を追加します。Microsoft.Web.Administration.dllは、C:\Windows\System32\inetsrvに存在します。
WebRole.csファイルを開きコードを入力します(リスト7)。ServerManagerクラスはIISの構成を管理するクラスです。このServerManagerクラスからアプリケーションプールを取得し、32bitアプリケーションが実行できるようにIISの構成変更を行います。
using System; using System.Linq; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.Diagnostics; using Microsoft.WindowsAzure.ServiceRuntime; using Microsoft.Win32; using Microsoft.Web.Administration; namespace WebRole1 { public class WebRole : RoleEntryPoint { public override bool OnStart() { using (ServerManager serverManager = new ServerManager()) { // Webロールのサイト名を取得 string siteName = RoleEnvironment.CurrentRoleInstance.Id + "_Web"; // サイト名をキーに、Appilcationを取得 var application = serverManager.Sites[siteName].Applications.First(); // アプリケーションプール名を取得 var applicationPoolName = application.ApplicationPoolName; // アプリケーションプールを取得 var applicationPool = serverManager.ApplicationPools[applicationPoolName]; // アプリケーションプールを32bit化 applicationPool.Enable32BitAppOnWin64 = true; // 変更をコミット serverManager.CommitChanges(); } return base.OnStart(); } } }
COMコンポーネントの登録と参照設定
COMコンポーネントの登録と参照設定を行います。
サンプルファイル(Sample.zip)をダウンロードし解凍します。解凍後に作成されるCOMフォルダから、AzureCOMSample.dllをWebロールプロジェクト内にコピーしプロジェクトに含めます。AzureCOMSample.dllもスタートアップスクリプトファイルと同じく、プロパティを常にコピーするに設定します。
管理者権限でコマンドプロンプトを開きregsvr32コマンドを実行します(リスト8)。
regsvr32 AzureCOMSample.dll
登録に成功すると成功した旨のメッセージボックスが表示されます(図4)。
続いて、Webロールのコンテキストメニューから[参照の追加]を選択し、登録したCOMコンポーネントへの参照を追加します(図5)。
これで、COMコンポーネントの登録は完了です。
Webフォームの修正
COMコンポーネントを呼び出し、結果を表示する部分を作成します。
Default.aspxを開き、リスト9のコードを入力します。
<%@ Page Title="ホーム ページ" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebRole1._Default" %> <asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> </asp:Content> <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> <h2> 権限昇格のサンプル(32bit COMの登録と呼び出し) </h2> <p> 実行モード: <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> </p> <p> <asp:TextBox ID="TextBox1" runat="server" Width="260px"></asp:TextBox> <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" /> <br /> <br /> <asp:Label ID="Label2" runat="server" Font-Bold="True" Font-Size="Large" /> </p> </asp:Content>
デザイナでの表示は、図6の通りです。
引き続き、コードビハインドクラスの修正を行います(リスト10)。
Label1には、現在のプロセスが32bitか64bitのいずれかで動作しているか表示します。IISのアプリケーションプールを32bitで構成しているため、常に32bitと表示されます。
ボタンのイベントハンドラメソッドには、COMクラスの生成とGetMessageメソッドの呼び出しを追加し、Label2に表示します。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebRole1 { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // 現在プロセスが32bit/64bit か判定。今回のサンプルでは、常に32bitと表示される。 this.Label1.Text = System.Environment.Is64BitProcess ? "64bit" : "32bit"; } protected void Button1_Click(object sender, EventArgs e) { // COMのクラス生成し呼び出す、結果を表示する。 var com = new AzureCOMSampleLib.AzureCOM(); this.Label2.Text = com.GetMessage(this.TextBox1.Text); } } }