确定哪个.net程序集加载了另一个

时间:2016-05-12 22:54:28

标签: c# .net

我正在订阅AppDomain.AssemblyLoaded事件,并希望知道从哪个程序集加载了所请求的(当前正在加载的)程序集。

如果程序集A包含对Assembly.Load(AssemblyB)的调用,我想在运行时确定程序集A导致加载程序集B.

1 个答案:

答案 0 :(得分: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,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089

     

System.Numerics.dll由System.Core.dll引用

     

System.Data.com引用了System.Numerics.dll

代码来自:https://msdn.microsoft.com/en-us/library/system.reflection.assembly.getreferencedassemblies(v=vs.110).aspx

(编辑删除了之前无用的答案)