2016-05-12 30 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,文化=中性公鑰= 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

@古斯曼 - 好的電話。我應該第二次閱讀這篇文章。 –

+0

編輯希望實際回答問題,感謝您的意見。 –

相關問題