C#中的程序集形式上是*.exe或*.dll,两者的区别是是否有程序的入口函数。程序集是.NET类型、代码、资源的集合。程序集又可分为动态程序集和静态程序集。
动态程序集:程序运行中动态加载到应用程序域(AppDomain),常见的是操作系统中的三大动态链接库kernel.dll,User.dll,Gdi.dll,当然C#中有自己的程序集封装API函数,
还记得程序的运行过程么,编译、链接、装入,链接程序将编译后的目标程序和用到的库函数(C++中的Include指令就是用来查找库的)链接在一起形成一个装入模块(可有多个模块)。当然装入又分为绝对装入、可重定位装入、动态运行时装入。
绝对装入:程序中给出装入内存的首地址,装入时就按这个地址装入,不需要进行地址转换。也就是给出绝对地址。
可重定位装入:绝对装入一般适合于单道程序,对于多道程序来说,每个模块的装入都要进行地址转换,给出相对地址,这样每次寻址都要和相对地址相加得出绝对地址,这些都是在装入时就进行转换,又称为静态重定位。汇编程序时指定的CS,DS段就是如此。
动态运行时装入:程序实际上在内存中要进行移动(例如换入,换出),这样地址就会变动,对于装进内存的目标快就有可能被换出,因此不能在装入时就把地址转换掉,要等到程序的运行时(寻址时)才进行转换,当然要有重定位寄存器支持。
当然链接也分为静态链接、装入时动态链接、运行时动态链接,它们最大的区别就是是否程序在执行时是否就已经装入内存(也就是按需装入).
动态程序集就是按需装入应用程序域的(类似于VC中的资源文件)。
静态程序集:存储在磁盘上的了执行文件中,(。。。。。。。。。。有点疑惑)
.NET运行时要将程序集加载到应用程序域(AppDomain)中,当然加载时也要有个过程它要去寻找程序集并判断是否已经被加载过了。AppDomain是为不同进程隔离.NET自己设置的疆域。程序集中的内容包括:程序集清单,mudle模块,CIL中间语言,资源。按这些内容是否在同一文件中又分为单文件程序集和多文件程序集,这些信息的描述在程序集清单中。
当然程序集又分为私有程序集和共享程序集。。。。。。。
所有这些的运行都是在CLR(动态语言运行时)环境里进行的,由它虚拟出堆栈,因此可以实现跨平台,但要求实现CLR或类似于CLR的东西,当然CLR也只是这种架构的一种实现。