我在.net中有一个类库项目,说“A”,它在构建时会创建一个dll,即“A.dll”。我有另一个项目说“B”,这个项目包含的dll“A.dll”的参考。当我在B中添加A的引用时究竟发生了什么?任何人都可以告诉我在编译期间和运行期间会发生什么?当你在你的项目中添加一个dll的引用时,会发生什么.net
2
A
回答
8
A.dll被编译器用来结合任何使用指令和别名来执行类型解析。当找到这些类型时,IL中将包含一个标识为的文件,该文件在A.dll中。如果完全没有使用A.dll,则参考文件将被无声地丢弃。
没有代码被复制 - 只有合格的名称等 - 因此您仍然需要将A.dll与B.dll(或GAC)一起部署。
在运行时,如果找到标记为A.dll中的某个类型,“fusion”将尝试加载并验证A.dll(这里有复杂的规则和可选的间接指针) - 一旦加载,它将解析指定的类型并继续(使用A.dll中的类型)。
2
目前还不清楚您要查找的细节级别,但是在非常基本的级别上,编译器会检测您是否实际使用来自A.dll的任何代码。如果没有,那么添加程序集引用的事实对生成的代码没有任何影响。
如果您使用的是A.dll的代码,编译器会在清单中为项目B生成的程序集添加对A.dll的引用。如果您查看生成的清单(使用像ildasm.exe这样的工具)你会看到参考。事情是这样的:
.assembly extern A
{
.ver 1:0:0:0
}
在运行时,.NET程序集加载器将确保A.DLL被载入根据需要,利用各种规则,试图找到A.DLL适当副本(看在全球程序集缓存,探测本地目录等)加载程序将负责实际加载引用的程序集到内存中,并执行任何必要的工作以确保代码实际上可以被调用。
相关问题
- 1. 当你不加入你的主题时会发生什么?
- 2. Erlang:当你f()中的一个Pid时会发生什么?
- 3. 当你产生一个循环时会发生什么?
- 4. 当你引用一个未定义的数组元素时,会发生什么?
- 5. 当你为自己添加一个列表时会发生什么?
- 6. 当你突然投入大型项目时,你会做什么?
- 7. 当你运行一个程序时会发生什么?
- 8. 当你在列表中调用`append`时会发生什么?
- 9. 当你在android中调用getSystemService(WIFI_SERVICE)时会发生什么?
- 10. 你怎么做到这一点,当你按下一个键会发生什么
- 11. 当你添加一个类到NSMutableArray并且你改变了这个对象和数组时,会发生什么?
- 12. 当你开始思考一个编程项目时,你首先会做什么?
- 13. 当你调用一个线程的中断()时会发生什么?
- 14. 当你同时触摸两个按钮时会发生什么
- 15. 为什么在你的项目中创建一个文件夹来保存你引用的dll?
- 16. 当你调用新的Object()时会发生什么?
- 17. 当你调用UItableview的重装两次时会发生什么
- 18. 当你增加数组时,会发生什么。 {A [in.nextInt()] ++;}
- 19. 当你在Bash中执行“ls”时会发生什么
- 20. 当你在浏览器中输入URL时会发生什么
- 21. 当你在进程中点击ctrl + z时会发生什么?
- 22. 当你改变一个用getter检索的对象时会发生什么?
- 23. 当你增加一个整数超过其最大值时会发生什么?
- 24. 当你在QtCreator中推广一个小部件时会发生什么?
- 25. 当你使用unbind()失败时会发生什么?
- 26. 当你调用object .__ new__时会发生什么?
- 27. 当你在unix shell上键入时会发生什么
- 28. 当你插入一个新的USB设备时会发生什么?
- 29. 当你等待一个失败的任务时会发生什么
- 30. 当你声明一个具有空边界的数组时会发生什么
基本上来自应用程序。 B你可以在编译时使用A.dll的Public成员 – 2010-11-09 08:41:28