ASP.NET のバージョン確認方法

こんにちは d99 です。
今年もよろしくお願いいたします。今日は ASP.NET のバージョンについてです。

ご存じの通り、.NET Framework は今までに 1.0、1.1、2.0、3.0、3.5、4.0 がリリースされています。3.0、3.5 は、コア機能は 2.0 のままで、それに追加機能が加わったものとなりますが、基本的にこれらのバージョンは一つのシステム上へ共存可能です (1.0 は既にサポートライフサイクルが終了しています。また OS によってはサポートされていない .NET Frameowrk バージョンがあります)。

そのため、.NET のバージョン確認方法はやや煩雑なものとなります(システムに共存できてしまうので、ある一箇所を見れば分かるというものではありません)。弊社の公式資料としては以下となります。

インストールされている Microsoft .NET Framework のバージョンおよび Service Pack のレベルを確認する方法
https://support.microsoft.com/kb/318785/ja

インストールされている .NET Framework バージョンの確認
https://msdn.microsoft.com/ja-jp/library/y549e41e.aspx

atmarkit 様でも非常に分かりやすいドキュメントを公開されています。

.NET Frameworkのバージョンを整理する
https://www.atmarkit.co.jp/fwin2k/win2ktips/1128dnfwvr/dnfwvr.html

.NET Frameworkのバージョンを確認する方法
https://www.atmarkit.co.jp/fwin2k/win2ktips/246checkvdnfw/checkvdnfw.html

では、ASP.NET のバージョンはどうやって調べるのがいいでしょうか。

ASP.NET の場合、<% System.DateTime.Now.ToString() %> と一行書いただけでも ASP.NET プログラムになりますので、作成した開発環境では判断できない場合もあります。また、IIS にも .NET のバージョン設定がありますが、ない場合もあります(例:Windows Server 2003 + .NET Framework 1.1 の場合、IIS マネージャー Web アプリケーションのプロパティに ASP.NET タブは表示されません)。さらに、たくさんサイト、アプリケーション、アプリケーションプールがある場合、どれがどれだか分からなくなってしまうような場合もあるかと思います。

私たちが、サポートの現場で時々使う方法の一つは 「サーバーローカルのブラウザから、そのアプリケーションの存在しない ASP.NET の URL をわざと要求してみてください」 というものです。例えば、https://localhost/hoge.aspx を要求します。私の手元では以下のようになりました。

404

このページの下部を見て頂くと、「バージョン情報:Microsoft .NET Framework バージョン: 4.0.30319; ASP.NET バージョン: 4.0.30319.547」 と表示されています。これが、その URL をホストしているアプリケーションプールで、今現在動いている .NET および ASP.NET の詳細バージョンになります。

ASP.NET では、エラーページ下部にバージョン番号を表示するようになっています。そこで、わざと存在しない URL をローカルから要求して FileNotFound エラーを発生させる事で、そのアプリケーションのバージョンを確認できます。もしアプリケーションが /Test だったら、https://localhost/Test/hoge.aspx といった URL を要求します。なお、このエラー表示の動作は web.config ファイル customErrors 要素、または IIS マネージャーの UI からは [エラーページ] の項目で制御出来ます。

customErrors 要素 (ASP.NET 設定スキーマ)
https://msdn.microsoft.com/ja-jp/library/h0hfz6fc(v=vs.100).aspx

なお、上記の環境は Windows 7 64bit ですが、既定の Web サイトのサイトルート、DefaulAppPool の ASP.NET のバージョンは 4.0 に設定されている事がわかります。また、ASP.NET のビルド番号を含む詳細バージョン番号で検索すると、この環境には MS11-100 のセキュリティパッチが適用済みである事も分かります。

"site:microsoft.com 4.0.30319.547" の検索結果
https://www.bing.com/search?q=site%3Amicrosoft.com+4.0.30319.547

おまけ

さて、では ASP.NET はこのバージョン番号をどこから取ってきているのでしょうか。以下に簡単に表でまとめましたのでご参照ください。もし 「特定の dll のバージョン情報から、ASP.NET の詳細バージョンを知る方法はないか?」 という疑問が湧いた際に、ご参考になるかと思います。

  .NET バージョン の元となる dll ASP.NET バージョン の元となる dll
.NET Framework 1.1 mscorlib.dll aspnet_isapi.dll
.NET Framework 2.0 - 3.5 mscorwks.dll webengine.dll
.NET Framework 4.0 GetSystemVersion() webengine4.dll

これらの dll の中にはグローバルアセンブリキャッシュ(GAC)に格納されているものもありますが、手作業で確認する場合は一般的に .NET インストールフォルダの dll を確認します。また、ASP.NET バージョンについては同フォルダ System.Web.dll で代用する場合があります。.NET インストールフォルダは以下の通りです。

<システムドライブ>:\%WinDir%\Microsoft.NET\Framework\v<バージョン番号>
<システムドライブ>:\%WinDir%\Microsoft.NET\Framework64\v<バージョン番号>

例: C:\Windows\Microsoft.NET\Framework\v2.0.50727

なお、.NET Framework 4.0 からは、インプロセス サイド バイ サイド(InProc SxS) が導入されているため、ASP.NET 自身も .NET バージョンを判定するためにプロセスにロードされている特定の dll を参照するのではなく、GetSystemVersion() メソッドを使用しています。

RuntimeEnvironment.GetSystemVersion メソッド
https://msdn.microsoft.com/ja-jp/library/system.runtime.interopservices.runtimeenvironment.getsystemversion.aspx

MSDN マガジン December 2009 > CLR 徹底解剖: インプロセス サイドバイサイド
https://msdn.microsoft.com/ja-jp/magazine/ee819091.aspx

ではまた。
d99 でした。