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);
}
}
}



