2010-11-09 20 views
2

我在.net中有一个类库项目,说“A”,它在构建时会创建一个dll,即“A.dll”。我有另一个项目说“B”,这个项目包含的dll“A.dll”的参考。当我在B中添加A的引用时究竟发生了什么?任何人都可以告诉我在编译期间和运行期间会发生什么?当你在你的项目中添加一个dll的引用时,会发生什么.net

+0

基本上来自应用程序。 B你可以在编译时使用A.dll的Public成员 – 2010-11-09 08:41:28

回答

8

A.dll被编译器用来结合任何使用指令和别名来执行类型解析。当找到这些类型时,IL中将包含一个标识为的文件,该文件在A.dll中。如果完全没有使用A.dll,则参考文件将被无声地丢弃。

没有代码被复制 - 只有合格的名称等 - 因此您仍然需要将A.dll与B.dll(或GAC)一起部署。

在运行时,如果找到标记为A.dll中的某个类型,“fusion”将尝试加载并验证A.dll(这里有复杂的规则和可选的间接指针) - 一旦加载,它将解析指定的类型并继续(使用A.dll中的类型)。

+0

嘿Marc非常感谢你对此的回复.. – samar 2010-11-23 09:40:12

+0

Marc Marc在这里只有1个问题。如果A.dll中的名称空间已包含在B.dll的类的顶部(借助“using”关键字),但是没有其他任何操作完成,即类中没有使用该名称空间的类,或者在整个A.dll中?这个DLL会被丢弃吗? – samar 2010-11-25 05:52:21

+0

@samar - 这不算作“正在使用”,所以是的,它会被丢弃。 – 2010-11-25 06:03:43

2

目前还不清楚您要查找的细节级别,但是在非常基本的级别上,编译器会检测您是否实际使用来自A.dll的任何代码。如果没有,那么添加程序集引用的事实对生成的代码没有任何影响。

如果您使用的是A.dll的代码,编译器会在清单中为项目B生成的程序集添加对A.dll的引用。如果您查看生成的清单(使用像ildasm.exe这样的工具)你会看到参考。事情是这样的:

.assembly extern A 
{ 
    .ver 1:0:0:0 
} 

在运行时,.NET程序集加载器将确保A.DLL被载入根据需要,利用各种规则,试图找到A.DLL适当副本(看在全球程序集缓存,探测本地目录等)加载程序将负责实际加载引用的程序集到内存中,并执行任何必要的工作以确保代码实际上可以被调用。

相关问题