2016-05-12 9 views
2

AppDomain.AssemblyLoadedイベントを購読していて、要求された(現在ロードされている)アセンブリがどのアセンブリからロードされているかを知りたい場合。別の.netアセンブリがロードされているかどうかを調べる

アセンブリAにAssembly.Load(AssemblyB)の呼び出しが含まれている場合、アセンブリAによってアセンブリBがロードされることを実行時に判別したいとします。

+1

私はアセンブリが、それはAppDomainのアセンブリに追加されますロードされたとき、それが可能だ信じないし、それが読み込まれたアセンブリへの参照(編集前の役に立たない答えを削除しました)保存された。 – Gusman

+0

私はどれくらいの信頼性があるのか​​分かりませんが、おそらく['StackTrace'](https://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace(v = vs.110) .aspx)クラスを呼び出し、AssemblyLoadedイベントが発生する前に誰がコールスタックを上回っていたかを確認します。 –

+0

多分あなたはこれを複雑にしています。 Aが何らかの理由でBの位置に影響を与えるならば、確実にAもイベントハンドラによってロードされました。したがって、「最後のもの」または「前のもの」は多少関連性があるはずです。それを過度に複雑にしないでください、DLL地獄は厄介です。 –

答えて

0

これは、参照アセンブリを取得しますが、これはやや近くにあります。より詳細な情報が得られるかどうかはわかりません。

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)); 
    } 
    } 
} 

出力:

ASSEMBLY LOADED:System.Numerics、バージョン= 4.0.0.0、文化=中立、なPublicKeyToken = b77a5c561934e089

System.Numerics.dllがSystem.Coreによって参照された .dllが

System.Numerics.dllは

のSystem.Data.dll

で参照されました虐殺

コード:https://msdn.microsoft.com/en-us/library/system.reflection.assembly.getreferencedassemblies(v=vs.110).aspx

+2

そのコードは、どのアセンブリが実際のメソッドを呼び出すのかだけを指示し、指定されたアセンブリをロードしたアセンブリは通知しません。 – Gusman

+0

@Gusman - よろしくお願いします。私は2回目の記事を読むべきだった。 –

+0

実際に質問に答えることを期待して編集しました。入力に感謝します。 –

関連する問題