Assembly即程序集是一个由类型定义、数据文件和资源文件组成的逻辑集合。每个程序集都包含一个程序集清单,该清单通常被附加在某个头文件上,也可以设置单独建立一个文件来包含该清单。

在编译程序集中间代码之前,CLR需要找到合适的程序集中间代码,其加载机制分为主动加载方式与通过名称、版本、文化和公钥来加载程序集。

  1. 程序集的主动加载方式:

程序集的加载可以完全忽略任何策略,由程序员在程序中显式的通过位置加载。System.Reflection.Assembly.LoadFrom提供了这个功能。此方法通过接收一个codebase风格的字符串,用以确定所要加载程序集的位置:

1
2
3
4
5
String codebase = @"../../../example/Compile/Compile.dll";
Assembly mycompile = Assembly.LoadForm(codebase);
Object compile = mycompile.CreateInstance("***.Compile");

采用这个方法会带了一些弊端:

如果加载一个具有相同标识的程序集,则即使指定了不同路径,LoadForm仍返回已加载的程序集。

如果用LoadForm加载一个程序集,随后加载上下文中的一个程序集尝试加载具有相同显示名称的程序集,则加载尝试将失败。

如果用LoadForm加载一个程序集,并且探测路径包括有相同标识但位置不同的程序集,则发生InvalidCastExcetion、 MissingMethodException或其他意外行为。

2.通过名称、版本、文化和公钥来加载程序集

当一个程序集按照 名称、版本、文化和公钥来加载程序集时首先会被应用版本策略来确定所有能够胜任的版本没接着CLR会在codebase制定的位置进行寻找,如果失败则接着在应用程序域目录下进行寻找。最后把得到的程序集传递给加载器。

1
2
3
4
5
String assemblyname = @"Compile," + "Version = *.*.*.*," + "Culture = Neutral," + "PublicKeyToken = ***";
Assembly mycompile = Assembly.Load(assemblyname);
Object compile = mycompile.CreateInstance("***.Compile");