CodeZine(コードジン)

特集ページ一覧

コンパイル済みのdllのみでASP.NETアプリケーションを実行する方法

aspxファイルなしで実行可能なWebアプリケーション配布のアイデア

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2005/09/28 12:00

ASP.NET Ver2.0では、aspxファイルのプリコンパイルがサポートされ、ツールなどが提供されます。それに先立って、ASP.NET Ver1.1でコンパイル済みのdllを取り出し、使うための手順を紹介します。

はじめに

 ASP.NET 1.1においては、実行環境からaspxファイルを取り除くことはできないと思われています。しかし、ちょっと面倒ではありますが、いくつかの手順を踏むことによって、aspxファイルを配布せずコンパイル済みのdllを利用してASP.NETアプリケーションを実行させることが可能です。

 以下の記事では、まず作業の手順を一通り紹介し、その後で技術的な解説を行います。

対象読者

 .NET Frameworkを用いてWebアプリケーションを開発している方。

必要な環境

 .NET FrameworkをインストールしたWindowsマシン。

作業の手順

事前準備

  1. ASP.NETアプリケーションをReleaseモードで実行できるようにしておきます。Visual Studio .NETで開発を行っている場合、モードをReleaseに変更し、また、「Web.Config」ファイルのcompilationセクションに記述されているdebug属性をfalseに書き換えたうえで、[ソリューションのビルド]を実行しておきます。
  1. サーバ上のASP.NETアプリケーションの実行をすべて停止し、次のフォルダ以下に存在するすべてのフォルダを削除します。
  2. 「C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files」
    ここでフォルダの削除がエラーになる場合は、サービスの管理ツールから[World Wide Web Publishing]サービスを再起動して、もう一度フォルダの削除を実行します。
  1. 最終的な成果物を格納するためのフォルダを新規に作成します。以下では、このフォルダを「成果物フォルダ」と記述します。成果物フォルダ内には「bin」という名前のフォルダを作成しておきます。

ASP.NETアプリケーションの実行とdllの取り出し

  1. ターゲットとなるASP.NETアプリケーションを実行します。ここですべてのページが一通り表示されるようにします。
実際の作業風景1
 私は「sample」というアプリケーション名で「default.aspx」ページとそこからボタンクリックで呼び出される「WebForm1.aspx」ページを作成していました。それらのページをここで表示しました。
  1. 2できれいにした「Temporary ASP.NET Files」フォルダに、新しくASP.NETアプリケーション名のフォルダが作成されています。このフォルダの下にはランダムな名前を持ったフォルダの階層が作成されています。この階層の中に含まれるすべてのdllファイルを成果物フォルダの中につくった「bin」フォルダにコピーします。
実際の作業風景2
 サンプルアプリケーションの実行によって「sample.DLL」「w0ctilyd.dll」「zsqgsacq.dll」という3つのdllファイルが作成されていました。dllファイルにはランダムで名前がつけられるため、このファイル名はあなたが実際に行ったときに作成されるファイル名と異なる可能性があります。また、dllファイルの数も作成しているアプリケーションによって異なります。
  1. 「bin」フォルダにコピーしたファイルを1つづつ.NET Framework SDKに含まれるildasmツールで開き、そこに含まれるクラス名を確認します。
実際の作業風景3
 3つのdllにはそれぞれ以下のクラスが含まれていました。
sample.DLLsample.Globalsample.WebForm1sample._default
w0ctilyd.dllASP.Global_asax
zsqgsacq.dll_ASP.WebForm1_aspx_ASP.default_aspx
  1. ASP.Global_asaxクラスが含まれているdllを削除します。
実際の作業風景4
 「w0ctilyd.dll」ファイルにASP.Global_asaxクラスが含まれていたので、このファイルを削除しました。

「web.config」ファイルの修正

  1. ターゲットとなるASP.NETアプリケーションの「global.asax」ファイルと「web.config」ファイルを成果物フォルダにコピーします。
実際の作業風景5
 sampleアプリケーションの「global.asax」ファイルと「web.config」ファイルを成果物フォルダにコピーしました。
  1. 「web.config」ファイルのsystem.webセクションの中にhttpHandlersセクションを追加します。その中にaddセクションを追加し、aspxファイル名、aspxファイルがコンパイルされたクラス名、そのクラスが含まれるdllファイル名を記述します。
  2.     <httpHandlers>
            <add verb="*" path="aspxファイル名" type="aspxクラス名, dllファイル名" />
        </httpHandlers>
    
実際の作業風景6
 「web.config」ファイルには以下の記述を追加しました。
    <httpHandlers>
        <add verb="*" path="default.aspx" type="_ASP.default_aspx, zsqgsacq" />
        <add verb="*" path="WebForm1.aspx" type="_ASP.WebForm1_aspx, zsqgsacq" />
    </httpHandlers>

「default.aspx」ファイルの追加

  1. 成果物フォルダに「default.aspx」ファイルを追加します。このとき、「default.aspx」ファイルの中身は空にします。
実際の作業風景7
 「default.aspx」ファイルを成果物フォルダに新規作成しました。

ASP.NETアプリケーションの実行

  1. 成果物フォルダを、IISの管理ツールから仮想ディレクトリとして追加します。追加した仮想ディレクトリにアクセスし、ターゲットのASP.NETアプリケーションと同じ動作をすることを確認します。
実際の作業風景8
 私は成果物フォルダを仮想ディレクトリとして追加し、追加したASP.NETアプリケーションが正しく動作することを確認しました。
 sampleアプリケーションではASP.NETアプリケーションに新しい名前をつけても正しく動作しましたが、HyperLinkコントロールを利用した場合はASP.NETアプリケーション名が同じでないとリンクが正しく動作しませんでした。

技術解説

「Temporary ASP.NET Files」フォルダとは何か

 ASP.NETであっても.NET Framework上で実行されるためにはコンパイル済みのdllファイルが必要です。ASP.NETでは、aspxファイルからソースコードを自動生成し、そのコードをコンパイルしてdllファイルを作成しています。このdllファイルが置かれる場所が、「Temporary ASP.NET Files」フォルダ以下に自動的に生成されるフォルダ階層になります。aspxファイルを修正した場合、新たにコンパイルが行われてdllファイルが追加されていきます。このため、上記の作業中ではまず存在しているすべてのdllファイルを削除し、最新のdllファイルのみを取り出すという手順を取っています。

httpHandlersセクションに何を追加しているのか

 ASP.NETでは、リクエストで指定されたパスに基づいて、そのリクエストをどのクラスが処理するかを設定することが可能です。この設定を行うのがhttpHandlersセクションです。ここで設定するリクエストを処理するためのクラスはIHttpHandlerインターフェイスを実装している必要があります。PageクラスはIHttpHandlerインターフェイスを実装していますので、Pageクラスを継承するaspxファイルもリクエストを処理するクラスとしての要件を満たしています。上記の作業でaspxファイルごとに処理を行うクラスを設定することにより、リクエストに対して直接クラスが呼び出されるようになります。このため、aspxファイル自体は存在していなくてもASP.NETの処理が行われます。

「global.asax」の取り扱い

 「global.asax」ファイルについてはコンパイル済みのdllを利用する方法がどうしても見つけられませんでした。そのため「global.asax」ファイルをコピーし、そのまま利用することにしました。この場合、「Temporary ASP.NET Files」フォルダから取り出したdllファイルにはコンパイルされた「global.asax」ファイルも含まれてしまうので、そのdllを削除する必要がありました。

「default.aspx」はなぜ必要か

 ファイル名を指定せずにASP.NETアプリケーションにアクセスした場合、まずIISが既定のドキュメントに設定されているファイルが存在しているかどうかをチェックします。このとき既定のドキュメントに設定されているファイルが1つも存在していないとエラーが表示されてしまいます。「default.aspx」ファイルが存在していれば、IISはリクエストを「default.aspx」ファイルに向けて送ります。このリクエストを受け取ったASP.NET側では、httpHanlersセクションの設定に従って「default.aspx」ファイルへのリクエストを_ASP.default_aspxクラスに送ります。このため、「default.aspx」ファイルは空であっても処理が行われることになります。

aspx以外のファイルを利用している場合の作業

 ユーザコントロール(ascxファイル)を利用している場合については、httpHandlersセクションへの追加は必要ありません。dllの中に利用しているascxファイルのクラスが存在していることだけを確認してください。ashxファイルを利用している場合は、aspxファイルと同様の設定をhttpHandlersセクションに対して行ってください。

まとめ

 この手順は、ASP.NETの仕組みについて調べていく中で思いついたアイデアをいろいろ試してみて、うまくいった結果をまとめたものです。そのため、すべての場合について確実に動作すると断言することはできません。この手順で問題が生じた場合は、ご報告いただけるとありがたいです。

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 小野 修司(オノ シュウジ)

    MVP for Visual Developer - Visual C# あおい情報システム株式会社勤務。 .NETに関する話題を扱う「どっとねっとふぁん」を運営。 &nbsp;

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5