きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

FileNotFoundException 指定されたモジュールが見つかりません 0x8007007E

ASP.NET 1.1 から 2.0への移植作業中に遭遇した、少しわかりにくい気がした例外メッセージについてメモ。(別に移行作業であるが故に発生したと言う訳ではないが。)

現象:

IISに配置し、実行(Webブラウザからアクセス)すると、次のようなメッセージとスタックトレースが表示される。

メッセージ:

System.IO.FileNotFoundException:指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E)

スタックトレース*1


[FileNotFoundException: The specified module could not be found. (Exception from HRESULT: 0x8007007E)]
System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
System.Reflection.Assembly.Load(String assemblyString)
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective)

[ConfigurationErrorsException: The specified module could not be found. (Exception from HRESULT: 0x8007007E)]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective)
System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory()
System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai)
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig)
System.Web.Compilation.BuildProvidersCompiler..ctor(VirtualPath configPath, Boolean supportLocalization, String outputAssemblyName)
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult(Boolean isPrecompiledApp)
System.Web.Compilation.BuildManager.CompileGlobalAsax()
System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()

[HttpException (0x80004005): The specified module could not be found. (Exception from HRESULT: 0x8007007E)]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException()
System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()
System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters)

[HttpException (0x80004005): The specified module could not be found. (Exception from HRESULT: 0x8007007E)]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context)
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context)
System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)

原因の分析及び対処:

何のモジュールが見つからないのかまったく書かれていないので非常に判り難いが、アセンブリが依存している"何か"が足りないときに出る模様。
それも、Webアプリケーション自身のアセンブリではなく、"参照している外部アセンブリ"が依存しているファイルが無い場合に出るものと思われる*2

原因のモジュールの特定は、
 ・自分のbinフォルダにある、自分自身のdll以外のアセンブリを削除
 ・その後ひとつずつ順番に追加、実行
 ・該当のエラーが出たら、その直前に追加したアセンブリに原因有り
としてまず原因が発生しているアセンブリを特定し、そのアセンブリについて依存関係を調査する*3方向で対応する。

今回の私の場合、使用しているサードパーティー製のDLLが内部で使用しているものにパスが通っていなかったことが原因でした。
ということで、Googleで検索してみた限り、本件に関するそのものズバリな情報が日本語では見つからなかったので(海外サイトでは見つかったが)、メモ。(たぶん、1年後くらいにおんなじことに遭遇したら、忘れてまたテンパリそうだし。)

*1:長いのでxx-smallで書きます。まあ、検索用ってことで

*2:Webアプリケーション自身が直接参照しているアセンブリが見つからない場合は、基本的に個別に何が見つからないのか出力される為

*3:外部製であれば、製造元の情報を調べたり問い合わせたり