ロードされたすべてのアセンブリをリストするにはどうすればよいですか?


101

.Netでは、すべてのAppDomainで読み込まれたすべてのアセンブリを列挙したいと思います。私のプログラムのAppDomainに対してそれを行うのは簡単AppDomain.CurrentDomain.GetAssemblies()です。どういうわけかすべてのAppDomainにアクセスする必要がありますか?それともこれを行うツールはすでにありますか?


1
GetAssemblies()再帰的ではないため、機能しないことに注意してください。ネストされたアセンブリ参照はすべて失われます。私は、の再帰的なバージョンを追加しましたGetAssemblies()stackoverflow.com/questions/383686/...
Contango 2014年

@Contango:AppDomain.CurrentDomain.GetAssemblies()まったく問題ありません。そもそも参照を列挙していないので、再帰的に参照をウォークする必要はありません。
Ben Voigt

回答:


94

Visual Studioの使用

  1. デバッガーをプロセスにアタッチします(例:デバッグから開始するか、デバッグ>プロセスにアタッチ)
  2. デバッグ中に、[モジュール]ウィンドウを表示します([デバッグ]> [ウィンドウ]> [モジュール])。

これは、各アセンブリ、アプリドメインに関する詳細を提供し、シンボル(つまり、デバッグ情報を含むpdbファイル)をロードするためのいくつかのオプションがあります。

ここに画像の説明を入力してください

プロセスエクスプローラーの使用

外部ツールが必要な場合は、Process Explorer(フリーウェア、Microsoftが公開)を使用できます。

プロセスをクリックすると、使用されているすべてのアセンブリのリストが表示されます。このツールは、ファイルハンドルなどの他の情報を表示するため、非常に優れています。

プログラム的に

それを行う方法を説明するこのSOの質問を確認してください。


1
ここで説明するよりも優れています。プロセスのプロパティページで、プロセスエクスプローラーはどのAppDomain(「共有ドメイン」を含む)アセンブリがロードされているかを正確に示すからです。したがって、プロセスに読み込まれる.dllだけではありません。彼らがこれを示すためにどのAPIを使用するかを知っておくとよいでしょう(「プログラムで」リンクすると、CurrentDomainのアセンブリが提供されます)。
Govert

22

これが私が最終的に得たものです。これはすべてのプロパティとメソッドのリストであり、各メソッドのすべてのパラメーターをリストしました。すべての値を取得することに成功しませんでした。

foreach(System.Reflection.AssemblyName an in System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies()){                      
            System.Reflection.Assembly asm = System.Reflection.Assembly.Load(an.ToString());
            foreach(Type type in asm.GetTypes()){   
                //PROPERTIES
                foreach (System.Reflection.PropertyInfo property in type.GetProperties()){
                    if (property.CanRead){
                        Response.Write("<br>" + an.ToString() + "." + type.ToString() + "." + property.Name);       
                    }
                }
                //METHODS
                var methods = type.GetMethods();
                foreach (System.Reflection.MethodInfo method in methods){               
                    Response.Write("<br><b>" + an.ToString() + "."  + type.ToString() + "." + method.Name  + "</b>");   
                    foreach (System.Reflection.ParameterInfo param in method.GetParameters())
                    {
                        Response.Write("<br><i>Param=" + param.Name.ToString());
                        Response.Write("<br>  Type=" + param.ParameterType.ToString());
                        Response.Write("<br>  Position=" + param.Position.ToString());
                        Response.Write("<br>  Optional=" + param.IsOptional.ToString() + "</i>");
                    }
                }
            }
        }

ところで...私はそれを最初の投稿から除外しましたが、そのようにいくつかの応答をフィルタリングしましたforeach(Type type in asm.GetTypes()){ if ((type.ToString().IndexOf("ACLASSIMLOOKINGFOR")>=0) || (type.ToString().IndexOf("BCLASSIMLOOKINGFOR")>=0)){...
s15199d

2
これはまったく質問に答えません。
Govert

GetExecutingAssembly()を使用する代わりに、GetEntryAssembly()を使用して、プログラムで使用されるアセンブリのより良いリストを確実に取得しています。ExecutingAssemblyがDLLである場合、そのうちのいくつかを見逃してしまいます。
ハリーグリノス2015

6
使用してみてください:Assembly []アセンブリ= AppDomain.CurrentDomain.GetAssemblies();
DanW 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.