C#程序集

.NET语言代码编译后的二进制文件,是程序集。

强命名程序集

使用私钥对签名过的程序集是强类型程序集。

强类型程序集可以进行全局部署。

通过sn.exe可以生产私钥。

大部分情况,我们自己的程序集是不签名的程序集。

附属程序集

附属程序集是一种只包含资源文件的程序集,用于配合主程序集,实现资源文件的多语种支持。

附属程序集的名称是程序集名称.resources.dll

附属程序集放在区域名称文件夹下面。对于中文是zh-Hans

可以使用al.exe编译附属程序集。al /t:lib /程序集名称.区域名称.resources /culture:区域名称 /out:程序集名称.区域名称.resources.dll

在最VS2019中,添加带区域名称的嵌入的资源会自动生成附属程序集。

全局程序集缓存

强类型的程序集可以放在全集程序集缓存(Global Assembly Cache,GAC)。

GAC下,同一程序集的不同版本会分开存放,不会新版本覆盖旧版本。

通过gacutil.exe可以将程序集部署到GAC。

程序集的加载

在程序运行时,使用到某个程序集的类型时,如果程序集还尚未加载,会加载程序集。

如果引用了程序集,没有使用其中的类型,编译后的代码是没有引用的。

如果使用了程序集的类型,只有代码执行不到,即使程序集不在,程序也不会报错。

程序集加载位置

程序当前目录

GAC

自定义位置

可以通过assemblyBinding下的probing下的privatePath指定程序集所在目录。

自定义加载实现

可以注册AppDomain.AssemblyResolve事件,动态加载所需的程序集。

动态加载程序集

可以在程序运行时,动态加载一个程序集。

和程序集相关的操作,在System.Reflection.Assembly类型上。

通过LoadFromFile可以加载一个程序集文件。

mscorlib程序集由于包含类核心类型,总是被加载。

卸载程序集

程序集被加载之后,是不能够进行卸载的。如果要卸载程序集,需要在新的应用程序域加载,通过卸载应用程序域来实现。