考虑一个引用两个程序集FooAssembly
和BarAssembly
的控制台应用程序(除系统程序集外)。此外,BarAssembly
引用FooAssembly
。我为应用程序AssemblyLoad
的{{1}}事件添加了一个处理程序,其中包含一个断点,以查看程序集的加载顺序。这是我的代码:
AppDomain
通过此设置,public class Program
{
static Program()
{
AppDomain.CurrentDomain.AssemblyLoad += OnLoad;
}
static void OnLoad(object sender, AssemblyLoadEventArgs e)
{
// do nothing, but include break-point
}
static void Main(string[] args)
{
FooAssembly.FooClass f = new FooAssembly.FooClass();
BarAssembly.BarClass b = new BarAssembly.BarClass();
}
}
首先加载,FooAssembly
加载第二。
但是,当我将Main方法更改为:
BarAssembly
static void Main(string[] args)
{
BarAssembly.BarClass b = new BarAssembly.BarClass();
FooAssembly.FooClass f = new FooAssembly.FooClass();
}
首先加载,BarAssembly
加载第二。
而且:
FooAssembly
static void Main(string[] args)
{
BarAssembly.BarClass b = new BarAssembly.BarClass();
}
首先加载,BarAssembly
加载第二。
所以在我看来,JIT编译器按照它需要编译的方法(在这种情况下为FooAssembly
)引用它们来加载程序集。
为什么Main
总是先加载FooAssembly
,因为BarAssembly
也引用它?
我对使用延迟加载程序集的AppDomains
概念比较陌生,所以任何解释和/或文档都会受到赞赏,谢谢。