首页 > 解决方案 > “程序集加载”只是“读取元数据表”的另一个术语吗?

问题描述

这个MSDN 文件说:

...您可以操作 Type 对象,而不必要求运行时加载它们引用的程序集。

所以我写了一个简单的应用程序来验证当我们只创建一个类型对象时不会加载程序集:

using System;
using MyLibrary;

// Main.exe
class Program {
   static void Main(string[] args) {
      Type t = typeof(Demo);
      var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();  // you can verify that MyLibrary.dll is loaded
      ...
   }
}

并且引用的类型Demo位于外部程序集(MyLibrary.dll)中:

//MyLibrary.dll
namespace MyLibrary
{
    public class Demo { ... }
}

我们可以看到它MyLibrary.dll仍然由 CLR 加载。

但是我认为在这里组装加载并不重要,这是我的理由:

当我们编译Main.exeMyLibrary.dll时,csc 编译器检测到Demo将在应用程序中使用,因此编译器将程序集引用记录发送到Main.exe的 AssemblyRef 表和 TypeRef 表中。前一条记录显示MyLibrary.dll是被引用的程序集,后一条记录显示被引用的类型是Demo.

所以程序编译运行后,CLR应该很聪明,可以读取Main.exe自己的TypeRef表,知道Demo是引用的类型,因为Type对象相对于TypeInfo对象是轻量级的对象,所以CLR不需要读取元数据表MyLibrary.dll,所以如果程序集加载”只是“读取元数据表”的另一个术语,那么 CLR 不应该加载MyLibrary.dll

但是你可以看到 CLR 仍然加载MyLibrary.dll,这是否意味着“程序集加载”不仅仅是“读取元数据表”?

标签: c#.net

解决方案


推荐阅读