我正在订阅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地狱是讨厌的。 –