AppDomain.AssemblyLoadedイベントを購読していて、要求された(現在ロードされている)アセンブリがどのアセンブリからロードされているかを知りたい場合。別の.netアセンブリがロードされているかどうかを調べる
アセンブリAにAssembly.Load(AssemblyB)の呼び出しが含まれている場合、アセンブリAによってアセンブリBがロードされることを実行時に判別したいとします。
AppDomain.AssemblyLoadedイベントを購読していて、要求された(現在ロードされている)アセンブリがどのアセンブリからロードされているかを知りたい場合。別の.netアセンブリがロードされているかどうかを調べる
アセンブリAにAssembly.Load(AssemblyB)の呼び出しが含まれている場合、アセンブリAによってアセンブリBがロードされることを実行時に判別したいとします。
これは、参照アセンブリを取得しますが、これはやや近くにあります。より詳細な情報が得られるかどうかはわかりません。
static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(MyAssemblyLoadEventHandler);
System.Data.DataColumn d = new System.Data.DataColumn();
Console.ReadLine();
}
static void MyAssemblyLoadEventHandler(object sender, AssemblyLoadEventArgs args)
{
Console.WriteLine("ASSEMBLY LOADED: " + args.LoadedAssembly.FullName);
string loadedAssemblyFullName = args.LoadedAssembly.FullName;
foreach (System.Reflection.Assembly parent in AppDomain.CurrentDomain.GetAssemblies())
{
System.Reflection.AssemblyName[] referencedAssemblies = parent.GetReferencedAssemblies();
string[] referencedFullNames = (from r in referencedAssemblies select r.FullName).ToArray();
if (referencedFullNames.Contains(loadedAssemblyFullName))
{
Console.WriteLine(System.IO.Path.GetFileName(args.LoadedAssembly.CodeBase) +
" was referenced by " +
System.IO.Path.GetFileName(parent.CodeBase));
}
}
}
出力:
のSystem.Data.dll で参照されました虐殺ASSEMBLY LOADED:System.Numerics、バージョン= 4.0.0.0、文化=中立、なPublicKeyToken = b77a5c561934e089
System.Numerics.dllがSystem.Coreによって参照された .dllが
System.Numerics.dllは
そのコードは、どのアセンブリが実際のメソッドを呼び出すのかだけを指示し、指定されたアセンブリをロードしたアセンブリは通知しません。 – Gusman
@Gusman - よろしくお願いします。私は2回目の記事を読むべきだった。 –
実際に質問に答えることを期待して編集しました。入力に感謝します。 –
私はアセンブリが、それはAppDomainのアセンブリに追加されますロードされたとき、それが可能だ信じないし、それが読み込まれたアセンブリへの参照(編集前の役に立たない答えを削除しました)保存された。 – Gusman
私はどれくらいの信頼性があるのか分かりませんが、おそらく['StackTrace'](https://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace(v = vs.110) .aspx)クラスを呼び出し、AssemblyLoadedイベントが発生する前に誰がコールスタックを上回っていたかを確認します。 –
多分あなたはこれを複雑にしています。 Aが何らかの理由でBの位置に影響を与えるならば、確実にAもイベントハンドラによってロードされました。したがって、「最後のもの」または「前のもの」は多少関連性があるはずです。それを過度に複雑にしないでください、DLL地獄は厄介です。 –