c# - “程序集加载”只是“读取元数据表”的另一个术语吗?
问题描述
这个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.exe
和MyLibrary.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++ - cv::createLineSegmentDetector() 函数的 Opencv4nodejs 插件崩溃。异常只能被 catch(...) 捕获。如何调试异常类型?
- android - com.microsoft.identity.client.exception.MsalClientException:无法执行云发现
- python - Python:写入文件后非常大的int包含空格
- javascript - Javascript:使用香草 javascript 隐藏和显示文本
- python - 从“挂起”蓝牙python连接中检测和恢复
- java - 添加新线程时的堆栈行为
- python - ValueError:时间数据“结束日期”与格式“%m/%d/%Y”不匹配
- amazon-web-services - 如何让 SQS 消息触发的 AWS Lambda 函数失败
- swift - Core Data 和 SwiftUI 多态性问题
- image - 如何使用 d3 将函数放入我的 svg 图像中?