我在.net中有一个类库项目说“A”,它在构建时会创建一个dll,即“A.dll”。我有另一个项目说“B”,这个项目包含dll“A.dll”的引用。当我在B中添加A的引用时到底发生了什么?任何人都可以告诉我在编译期间和运行期间会发生什么?
答案 0 :(得分:8)
编译器将A.dll与任何using指令和别名结合使用,以执行类型解析。当找到这些类型时,IL中包含 A.dll 中类型的标记。如果完全没有使用A.dll,则会默默地删除。
没有代码被复制 - 只有合格的名称等 - 因此你仍然需要在你的B.dll(或GAC)中部署A.dll。
在运行时,当找到A.dll中类型的标记时,“fusion”会尝试加载并验证A.dll(这里有复杂的规则和可选的间接) - 一旦加载它就会解析指定的类型并继续(使用A.dll中的类型)。
答案 1 :(得分:2)
目前尚不清楚您正在寻找什么级别的详细信息,但在最基本的级别,编译器将检测您是否实际使用了A.dll中的任何代码。如果没有,添加程序集引用这一事实对生成的代码没有任何影响。
如果您使用的是A.dll中的代码,编译器将在清单中为项目B生成的程序集添加对A.dll的引用。如果您查看生成的清单(使用ildasm.exe之类的工具)你会看到参考。像这样:
.assembly extern A
{
.ver 1:0:0:0
}
在运行时,.net程序集加载程序将确保根据需要加载A.dll,使用各种规则来尝试查找A.dll的相应副本(查看全局程序集缓存,探测本地目录等) 。)加载器将负责将引用的程序集实际加载到内存中并进行任何必要的工作以确保实际可以调用代码。