IIS ASP.NET 複数バージョン混在時のエラー

2010/08/06
★★★

前回の記事では、Windows Server 2008 の IIS 7 では、バージョンの異なる .NET Framework ランタイムをアプリケーションプール単位で混在させることができることを紹介した。

今回は、複数のバージョンの異なる ASP.NET アプリケーションをホストする際の注意点を説明する。

一つのサイトに複数のバージョンを混在させると、以下のようなメッセージが出力され、エラーが発生する場合がある。

ファイルまたはアセンブリ 'Masudaq.Library.Net'、またはその依存関係の 1 つが読み込めませんでした。このアセンブリは現在読み込まれているランタイムより新しいランタイムでビルドされているため、読み込むことができません。

スタック トレース:
[BadImageFormatException: ファイルまたはアセンブリ 'Masudaq.Library.Net'、またはその依存関係の 1 つが読み込めませんでした。このアセンブリは現在読み込まれているランタイムより新しいランタイムでビルドされているため、読み込むことができません。]
 System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
 System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +416 System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +166
 System.Reflection.Assembly.Load(String assemblyString) +35
 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +190

[ConfigurationErrorsException: ファイルまたはアセンブリ 'Masudaq.Library.Net'、またはその依存関係の 1 つが読み込めませんでした。このアセンブリは現在読み込まれているランタイムより新しいランタイムでビルドされているため、読み込むことができません。]
 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +11203480
 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +388
 System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +232
 System.Web.Configuration.AssemblyInfo.get_AssemblyInternal() +48
 System.Web.Compilation.CompilationUtil.GetTypeFromAssemblies(AssemblyCollection assembliesCollection,
 String typeName, Boolean ignoreCase) +166 System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) +362
 System.Web.Configuration.HandlerFactoryCache.GetHandlerType(String type) +23
 System.Web.Configuration.HandlerFactoryCache..ctor(String type) +25 System.Web.HttpApplication.GetFactory(String type) +91
 System.Web.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +338
 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +263

これは、ASP.NET アプリケーションをネストし、上位の ASP.NET アプリケーションが、下位より、古いバージョンの .NET Framework を用いたアプリケーションプールを設定した際に発生する。

以下のサイトにも説明があるが、古いバージョンの .NET Framework には、上位互換がないため、上位の古いバージョンの Web.config を継承することにより発生してしまう障害である。

方法: ASP.NET Web アプリケーションを ASP.NET 4 にアップグレードする

もちろん、逆の場合、つまり、新しいバージョンが上位にネストされている場合では、新しいバージョンの .NET Framework は、下位互換があるため、このようなエラーは発生しない。

運用環境においては、複数のバージョンのを混在させたい積極的な理由がない場合は、同一バージョンに統一することが望ましいだろう。