14

と比較するとAppDomain.GetAssemblies()BuildManager.GetReferencedAssemblies()System.Web.Compilation.BuildManager)は、実行時にASP.NETアプリケーションによって参照されるアセンブリを取得するためのより信頼性の高い方法のようです。これは、AppDomain.GetAssemblies()が「既にロードされているアセンブリのみを取得するためです。このアプリケーションドメインの実行コンテキスト」。

すべてのアセンブリを反復処理することは、アプリケーションの起動時にDIコンテナにタイプを動的に登録するための重要なツールであり、特にアプリケーションの起動時に、他のアセンブリがまだロードされていない可能性があります(不要な場合)。コンポジションルートはそれらを必要とする最初のもの。したがって、アプリケーションの参照アセンブリを取得するための信頼できる方法を用意することが非常に重要です。

ASP.NETアプリケーションの信頼できる方法ですがBuildManager.GetReferencedAssemblies()、疑問に思っています。デスクトップアプリケーション、Windowsサービス、セルフホストWCFサービスなど、他の種類のアプリケーションで利用できる代替手段は何でしょうか。

4

3 に答える 3

12

私が現在見ている唯一の方法は、内部で行うのと同じように、参照されているすべてのアセンブリを手動でプリフェッチすることですBuildManager

var assemblies =
    from file in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory)
    where Path.GetExtension(file) == ".dll"
    select Assembly.LoadFrom(file);
于 2012-10-08T12:11:09.773 に答える
2

私も同じ問題を抱えています。そして、いくつかの調査を行った後、私はまだ確かな答えを見つけていません。私が思いついた最高のことはAppDomain.CurrentDomain.GetAssemblies()AppDomain.AssemblyLoadイベントと組み合わせることです。

このようにして、すべての新しいアセンブリの通知を受け取りながら、すでにロードされているすべてのアセンブリを処理できます(次にスキャンします)。

于 2012-10-08T11:41:15.063 に答える
0

このソリューションは、@stevenの回答に基づいています。ただし、Web、WinForms、コンソール、およびWindowsサービスでは機能します。

var binDirectory = String.IsNullOrEmpty(AppDomain.CurrentDomain.RelativeSearchPath) ? AppDomain.CurrentDomain.BaseDirectory : AppDomain.CurrentDomain.RelativeSearchPath;

var assemblies = from file in Directory.GetFiles(binDirectory)
                 where Path.GetExtension(file) == ".dll"
                 select Assembly.LoadFrom(file);
于 2018-06-01T21:27:43.747 に答える