アセンブリバインドとは

発生する現象

ラステイル Ver 4.0 を起動したときに以下のエラーメッセージが表示されて正常に起動されない。

エラーメッセージ

プロジェクトファイルの展開に失敗しました。
別な作業フォルダに新規プロジェクトを作成します。

エラー詳細

System.IO.FileNotFoundException: ファイルまたはアセンブリ 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。
ファイル名 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' です。
   場所 fx.a(String A\_0, String A\_1)
   場所 bg.a(String A\_0, String A\_1)
   場所 bg.c(String A\_0, String A\_1)
   場所 fh.h()
   場所 fh.m(String A\_0)
   場所 fh.b()

警告: アセンブリ バインドのログ記録がオフにされています。
アセンブリ バインドのエラー ログを有効にするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) を 1 に設定してください。
注意: アセンブリ バインドのエラー ログに関連するパフォーマンス ペナルティがあります。
この機能をオフにするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] を削除します。

発生条件

.NET Framework 4 のランタイムをインストールしていない場合に発生します。

対応策

以下のサイトから .NET Framework 4 のランタイムをインストールしてください。

  • http://www.microsoft.com/downloads/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992&displaylang=ja

More than 1 year has passed since last update.

posted at 2019-11-30

問題

自分で .NET Framework のアプリケーションをビルドして実行すると動作するファイルを,友人のコンピュータに転送し実行したところ次のような例外が投げられ正常動作しなかった。

System.IO.FileNotFoundException: ファイルまたはアセンブリ '***', またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。
(Exception.ToString より抜粋)

また,転送する際に含めたファイルを自身のコンピュータの別のディレクトリに展開し実行すると,次のような例外が投げられ正常動作しなかった。

System.IO.FileLoadException: ファイルまたはアセンブリ '***'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)
警告: アセンブリ バインドのログ記録がオフにされています。

アセンブリ バインドのエラー ログを有効にするには、レジストリ値 HKLM\Software\Microsoft\Fusion!EnableLog を 1 に設定してください。

注意: アセンブリ バインドのエラー ログに関連するパフォーマンス ペナルティがあります。

この機能をオフにするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] を削除します。
(Exception.ToString より抜粋)

原因

.exe.config ファイルが実行ファイルと同じディレクトリに存在しない。

解決策

.exe.config を実行ファイルと同じディレクトリに配置する。(アーカイブに含める。)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information

What you can do with signing up

「Fusionログ」について。

.NETアプリの実行時にアセンブリのバインド情報をログ出しするツール。

CLRによるアセンブリのバインドが失敗するケース(GACやCodeBase、或はルートフォルダに対象のモジュールが存在しない時など)では、CLRからThrowされたTypeLoadExceptionの内容をログ出し出来ていれば、十分解析可能。
が、例外はThrowされないんだけど、

  • 意図したバージョンのモジュールをバインドできているか?
  • 間接的に意図していないモジュールをバインドしていないか?

といった確認には使えるかも。

「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion」のキーに以下の要素を追加する。

名前 : 「ForceLog」

種類 : 「REG_DWORD」

値 : 「1」

名前 : 「LogPath」

種類 : 「REG_SZ」 ※文字列型

値 : 「C:\FusionLogs」 ※ログの出力先ディレクトリのパス

アセンブリバインドとは

対象のアプリを実行するのみ。

CLRによるアセンブリのバインドのタイミングで「LogPath」に指定されたディレクトリにFusionログが出力される。ログの形式はHTML。

アセンブリバインドログビューア(Fuslogvw.exe)を利用するとアセンブリバインドの詳細を表示するとこができます。
したがって、Fuslogvw.exeを利用することにより、dllがみつからずに発生した例外時のトラブルシューティングに役に立ちます。

今回利用するサンプルアプリ
あるアプリ(fuslogvw_Test1.exe)を実行すると例外System.IO.FileNotFoundExceptionが発生してしまった状況を考えます。

アセンブリバインドとは

表示される例外の情報よりMyLibraryが見つからなかったために発生した例外であることはわかりますが、システムはどこを探したのかがわかりません。以下fuslogvw.exeを利用して、この情報を確認する方法を記述します。
ちなみに、fuslogvw_Test1.exeのソースコードは以下です。
Main()でMyLibrary.dllに定義があるClass1を作成する単純なアプリです。
Main()のC#コード

using MyLibrary;
 
namespace fuslogvw_Test1
{
    class Program
    {
        static void Main(string[] args)
        {
            Class1 cl = new Class1();
        }
    }
}

MyLibraryのC#コードは以下です。

namespace MyLibrary
{
    public class Class1
    {
    }
}

すなわち、fuslogvw_Test1.exeにはMyLibrary.dllが必要でありMyLibrary.dllがないとSystem.IO.FileNotFoundExceptionが発生します。

Fuslogvw.exeのインストール
Fuslogvw.exeのインストールには2つの方法があります。
1. Visual Studio 2010のインストール
Visual Studioをインストールすると、スタートメニューに"Fusion ログ ビューアー"という項目ができます。

アセンブリバインドとは

2. Windows SDKのインストール
Windows SDKをインストールすると、スタートメニューに"Fusion Log Viewer"という項目ができます。
アセンブリバインドとは

Fuslogvw.exe実行例
1. Fuslogvw.exeを管理者権限で起動します。
起動後以下のような画面になります。

アセンブリバインドとは

2. "設定"をクリックし、"バインドの失敗をディスクに記録する"を選択します。
アセンブリバインドとは

アセンブリバインドとは

3. MyLibrary.dllがない状態でサンプルアプリを実行し例外を発生させます。
アセンブリバインドとは

4. "最新の情報に更新"をクリックします。
アセンブリバインドとは

5. ログが表示されます。
アセンブリバインドとは

6. 表示されたログをダブルクリックします。
以下のようなログが現れます。
アセンブリバインドとは

上記のようにシステムが探そうとしたファイル名、探したパスが表示されます。
今回の場合は、上記の場所にMyLibrary.dllがなかったため例外が発生したことがわかります。

リンク
Fuslogvw.exe (Assembly Binding Log Viewer)
http://msdn.microsoft.com/en-us/library/e74a18c4.aspx
・ASSEMBLY PROBING, FUSION AND FUSLOGVW IN 5 MINUTES
http://bartdesmet.net/blogs/bart/archive/2006/10/23/Assembly-probing_2C00_-Fusion-and-fuslogvw-in-5-minutes.aspx


  1. 2012/05/23(水) 14:28:32|
  2. .NET
  3. | トラックバック:0
  4. | コメント:0