2

Application_StartASP.NET Web フォーム アプリケーションのメソッドで、読み込まれたすべてのアセンブリ (およびそのバージョン番号) を log4net ログ ファイルに一覧表示する、すべての Web アプリケーションで使用するライブラリ モジュールがあります。

これは何年にもわたって問題なく機能してきました-今日まで、「アプリケーションのウォームアップ」メソッド( Scott Guthrie のブログ投稿で説明されているように、IIS への展開後(およびASP.NETが実行される前)に実行された後)の後に使用しようとしましたが、Application_Start今では突然エラーが発生しました:

System.NotSupportedException: 呼び出されたメンバーは動的アセンブリでサポートされていません。

読み込まれたアセンブリを報告するコードは次のようになります。

public static void ReportLoadedAssemblies(this ILog log) 
{
    if (log.IsInfoEnabled) 
    {
        log.Info("Loaded assemblies:");

        IEnumerable<Assembly> appAssemblies = AppDomain.CurrentDomain.GetAssemblies().OrderBy(c => c.ManifestModule.Name);

        foreach (Assembly asm in appAssemblies) 
        {
            FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(asm.Location);

            if (!fvi.CompanyName.Contains("Microsoft")) 
            {
                log.Info(String.Format("{0, -45} : {1, -15} {2}", fvi.FileDescription, fvi.FileVersion, asm.Location));
            }
        }
    }
}

どの行で正確にエラーがスローされるかは100%明確ではありません-これが次の行であると思われます:

IEnumerable<Assembly> appAssemblies = AppDomain.CurrentDomain.GetAssemblies().OrderBy(c => c.ManifestModule.Name);

では、このメッセージは正確には何を伝えているのでしょうか? また、この状況でロードされたアセンブリを取得するにはどうすればよいですか?

4

1 に答える 1

2

エラーは出ていないと思います

IEnumerable<Assembly> appAssemblies = AppDomain.CurrentDomain.GetAssemblies().OrderBy(c => c.ManifestModule.Name);

Assembly.Locationアセンブリが動的に生成されるときにプロパティにアクセスすると、 がスローされるためNotSupportedExceptionです。

では、このメッセージは正確には何を伝えているのでしょうか?

動的に生成されたアセンブリに場所がない場合、そのプロパティにアクセスできません。はい、空の文字列を返す可能性がありますが、それはで作成されたアセンブリと同じになりAssembly.Load()ます...真剣に言うと、この選択の理論的根拠は理解できませんが、それだけです。

また、この状況でロードされたアセンブリを取得するにはどうすればよいですか?

単純に確認してください:

foreach (Assembly asm in appAssemblies.Where(x => !x.IsDynamic)) 
{
    // Your code
}   

または簡単:

var appAssemblies = AppDomain.CurrentDomain.GetAssemblies()
    .Where(x => !x.IsDynamic)
    .OrderBy(c => c.ManifestModule.Name);
于 2016-01-15T14:08:09.727 に答える