【发布时间】:2014-02-21 16:28:19
【问题描述】:
所以我试图准确了解 .NET 程序集何时加载到 .NET 进程中。我阅读了this blog entry,它很好地解释了事情,并证实了很多我认为我已经知道的东西,但它也提出了我认为我有点误解的一点。
依赖程序集在第一次被引用时及时加载 代码
我认为这意味着当第一次调用程序集时,程序集被加载到程序中。因此,如果我有一个像下面的示例这样的程序,其中实例化 RasDialer 类的行将永远不会被调用 - 我相信 DotRas 程序集永远不会加载到进程中,我对此肯定是错误的。
但是,如果代码在我注释掉的部分中确实无法访问 - 那么程序集将永远不会加载,但似乎如果有机会,那么程序集将被加载。
这是我的小测试应用程序:
static void Main(string[] args)
{
Console.WriteLine("Before");
var dictionary = new Dictionary<int, string>();
PrintAssemblies(); // <- DotRas is loaded here for null check variant
if (dictionary == null)
{
// This line will never execute, but it does not matter
var dialer = new RasDialer();
}
// DotRas will not be loaded if I uncomment this and comment
// out the other if statement since it is truly unreachable
//if (false)
//{
// var dialer = new RasDialer();
//}
Console.WriteLine(Environment.NewLine + "After");
PrintAssemblies();
Console.ReadLine();
}
public static void PrintAssemblies()
{
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (var assembly in assemblies)
{
Console.WriteLine(assembly.GetName());
}
}
有没有简单的方法来判断程序集何时加载到内存中?
在我在顶部链接的博客条目中 - 他的依赖程序集在他调用 PrintAssemblies() 之后才会加载,但对于我来说,依赖程序集在调用之前加载。所以它似乎并不容易预测。
如果 JIT 编译器可能需要依赖程序集中的类型,那么我是否正确地假设它会导致程序集被加载?
【问题讨论】:
标签: .net .net-assembly jit