我正在订阅AppDomain.AssemblyLoaded事件,并希望了解当前被加载的程序集是从哪个程序集加载而来。
如果程序集A包含对Assembly.Load(AssemblyB)的调用,我想在运行时确定是程序集A导致程序集B被加载。
如果程序集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.Numerics,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089
System.Core.dll 引用了 System.Numerics.dll
System.Data.dll 引用了 System.Numerics.dll
(编辑删除之前无用的回答)
StackTrace
类,并查看在AssemblyLoaded事件发生之前调用堆栈中更高层次的人是谁? - Scott Chamberlain