我正在訂閱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));
}
}
}
輸出:
引用從屠宰ASSEMBLY LOADED:System.Numerics,版本= 4.0.0.0,文化=中性公鑰= b77a5c561934e089
System.Numerics.dll通過System.Core程序引用.DLL
System.Numerics.dll是由System.Data.dll中
(編輯刪除以前無益的答案)
該代碼只會告訴哪個程序集正在調用實際的方法,而不是哪個程序集加載了指定的程序集。 – Gusman
@古斯曼 - 好的電話。我應該第二次閱讀這篇文章。 –
編輯希望實際回答問題,感謝您的意見。 –
我不相信的這是可能的,當組件加載它添加到AppDomain的組件和其裝載,大會沒有參考保存。 – Gusman
我不知道它有多可靠,但也許使用['StackTrace'](https://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace(v = vs.110) .aspx)類並在AssemblyLoaded事件發生之前查看誰在調用堆棧中位於較高位置? –
也許你太過複雜了。如果A以某種方式影響B的位置,那麼肯定A也是由你的事件處理程序加載的。所以「最後一個」或「以前的」應該有些相關。不要過度複雜化,DLL地獄是討厭的。 –