私のアプリケーションで使用されているすべてのアセンブリ(.dll)を読み取る方法を探しています。アプリケーションで使用するDLLの名前を取得する方法
標準のC#プロジェクトでは、「参照」フォルダがあります。展開すると、使用するすべてのライブラリを読むことができます。
私の目標は、自分のソリューションで各プロジェクトで使用されているすべてのアセンブリをプログラムで読み込むことです。
最後に、コンパイルされた* .exeアプリケーションでどのライブラリが使用されているか確認したいと思います。
私のアプリケーションで使用されているすべてのアセンブリ(.dll)を読み取る方法を探しています。アプリケーションで使用するDLLの名前を取得する方法
標準のC#プロジェクトでは、「参照」フォルダがあります。展開すると、使用するすべてのライブラリを読むことができます。
私の目標は、自分のソリューションで各プロジェクトで使用されているすべてのアセンブリをプログラムで読み込むことです。
最後に、コンパイルされた* .exeアプリケーションでどのライブラリが使用されているか確認したいと思います。
あなたはAssembly.GetReferencedAssemblies
を見ましたか?
あなたが使用していない参照は、最終的にメタデータに書き出されることはないので、実行時には表示されません。
アセンブリを指定することなく、名前付きの型を見つけるために今まで再帰的にGetReferencedAssemblies
を使用しました。
AppDomain.GetAssembliesを使用できます。
しかし、これにより、アプリケーションに明示的または暗黙的に使用されるすべてのアセンブリが提供されます。
Assembly
オブジェクトをお持ちの場合は、GetReferencedAssemblies()
を呼び出して、アセンブリで使用する参照を取得できます。現在実行中のプロジェクトで使用するアセンブリのリストを取得するには、使用することができます。
System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies()
を私はあなたが使うことができますね。
AssemblyName[] assemblies = this.GetType().Assembly.GetReferencedAssemblies();
System.Reflection.Assembly []ar=AppDomain.CurrentDomain.GetAssemblies();
foreach (System.Reflection.Assembly a in ar)
{
Console.WriteLine("{0}", a.FullName);
}
を適切にこれを行うには、アセンブリを歩く必要がありますあなたのexeがDll_Aを必要とし、Dll_AがDll_Bを必要とする場合(たとえexeがそれを参照しなくても)、あなたのexeもDll_Bを必要とします。
これを(どのアセンブリでも)リフレクションによってクエリできます。それは(特に、循環参照を防ぐためにどのがが起こるのか少し手間がかかります。ここでは、「エントリ・アセンブリー」で始まり、一例だが、これは同じように簡単に任意のアセンブリのようになります。私が理解したよう
List<string> refs = new List<string>();
Queue<AssemblyName> pending = new Queue<AssemblyName>();
pending.Enqueue(Assembly.GetEntryAssembly().GetName());
while(pending.Count > 0)
{
AssemblyName an = pending.Dequeue();
string s = an.ToString();
if(refs.Contains(s)) continue; // done already
refs.Add(s);
try
{
Assembly asm = Assembly.Load(an);
if(asm != null)
{
foreach(AssemblyName sub in asm.GetReferencedAssemblies())
{
pending.Enqueue(sub);
}
foreach (Type type in asm.GetTypes())
{
foreach (MethodInfo method in type.GetMethods(
BindingFlags.Static | BindingFlags.Public |
BindingFlags.NonPublic))
{
DllImportAttribute attrib = (DllImportAttribute)
Attribute.GetCustomAttribute(method,
typeof(DllImportAttribute));
if (attrib != null && !refs.Contains(attrib.Value))
{
refs.Add(attrib.Value);
}
}
}
}
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
}
}
refs.Sort();
foreach (string name in refs)
{
Console.WriteLine(name);
}
これは、PInvoke経由で使用される管理されていないDLLを検出するのでしょうか、それともDLLを管理するだけですか? –
管理対象のDLLだけです。しかし、それはやや異なった反映であろう。 –
どうすればいいですか?私のリフレクションについての知識は限られています。あなたは正しい方向に向けることができますか? –
すでにロードされているものを与えるでしょうメタデータ内で参照されているものの、これまで実行されていないためロードされていないものがあります –
あなたのヒントありがとう!このAppDomain.CurrentDomain.GetAssemblies()も面白かった – Maciej