1. 程序集(Assembly),可以看做是一堆相关类打一个包,相当于java中的jar包。打包的目的:程序中只引用必须的程序集,减小程序的尺寸;一些程序集内部的类不想让其他程序集调用。
2. 我们调用的类都是位于各个程序集中,如果调用的类在没有引用的程序集中,则需要添加对那个程序集的引用,比如ConfigurationManager。
3. 访问级别:private(本类内部才能调用)、public(所有人都能调用)、protected(只有子类才能调用)。
4. 类如果不标注访问级别则是internal级别,也就是只能在程序集内部访问,如果想跨程序集访问,则需要public或者使用InternalsVisibleTo 。
5. 还可以编写自己的程序集,新建→类库,使用这个类库的程序只要引用生成的dll即可,如果是引用同一个解决方案中类库,则最好添加项目引用。项目不能循环引用,就是A引用B,B又引用A。
6. exe、dll都是程序集,只不过exe有入口而已,exe也可以被添加引用。dll不一定是程序集(VC写的dll就不是程序集),程序集不一定是dll(.net写的EXE也是程序集)。EXE也不一定是程序集(VC写的EXE就不是程序集)。托管(Managed)代码(MSIL)。非托管。
7. GAC(全局程序集),数字签名(防止引用的程序集被篡改)。
附加:
1. internal修饰的有可能是类,有可能是方法,有可能是属性。(访问级别是本程序集才能访问)。
2. 类如果没有标记public或者internal,则默认是internal 。
3. 一个解决方案下的两个或多个项目之间的调用就可以通过引用程序集来实现。当然微软更推荐直接通过添加引用来实现。也可以通过添加项目来实现。
但是只能单向引用,不能双向引用。比如:项目A调用项目B,这是正确的。项目A调用项目B,项目B调用项目A,这是错误的。项目A调用项目B,项目B调用项目C,项目C调用项目A,这也是错误的。不能循环依赖。
但是不能调用程序集中 internal 修饰的类。比如一个程序集中有多个类,有的类是public修饰,有的类是internal修饰,这时候引用这个程序集以后,只能调用其中public修饰的类,而internal修饰的类不能调用。
4. 判断是否是程序集的方法:
方法一:用反编译工具,看看是否可以反编译,能被反编译的就是程序集,不能被反编译的就不是程序集。
方法二:看.NET能否将其添加到引用。如:用vs开发工具添加引用,能被添加到引用的就是程序集,不能被添加到引用的就不是程序集。
5. 托管代码:咱们平时写的.NET代码是可以反编译出来的,都是托管代码。
非托管代码:编译成普通的机器码。
6. GAC:global assembly cache 全局程序集缓存。
7. 两个解决方案之间也可以调用程序集。程序集相当于类库,只要引用了就能调用。