2016-05-12 70 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

编辑希望实际回答问题,感谢您的意见。 –

相关问题