关于Assembly的动态加载
Assembly的加载通常是由CLR隐式进行的,CLR的原则是只有用到时才加载,也就是说很多时候在应用程序运行过程中还要进行加载Assembly的动作,如果希望显式的在可预期的时候动态加载Assembly, 可以采用以下方法:
Assembly的动态加载有两种主要形式,都是使用Assembly类的静态方法:
* Assembly.LoadFrom(FilePath|URI): 直接指定Assembly的文件路径或URI,调用Assembly Loader;
* Assembly.Load(FullQualifiedAssemblyName):需要输入Assembly的全名称(包括name, version, culture, public key token),该种加载调用Assembly resolver,并基于以下策略来定位相应的Assembly:
1. Assembly是否有public key,如果没有直接到Probing (step 5),如果有则应用version policy
2. 基于version policy,也就是.config文件种的assemblyBinding元素下assembly定位的信息;
3. 如果无法通过version policy定位,则在GAC种查找;
4. 如果无法在GAC中定位assembly,codeBase来定位,如果通过codeBase找到的文件不匹配,则失败;
5. 如果无法通过codeBase定位,则通过probing方式来查找,如果找到的文件不匹配,则失败。
6. 在第一步之前应该还可以在DEVPATH系统变量中查找,但一般这只是给开发者用的而不是在部署时用的,所以可以忽略不计。
以上两种方式表面上类似,但一个是调用Loader,一个调用Resolver,实际差别很大。
Assembly的动态加载有两种主要形式,都是使用Assembly类的静态方法:
* Assembly.LoadFrom(FilePath|URI): 直接指定Assembly的文件路径或URI,调用Assembly Loader;
* Assembly.Load(FullQualifiedAssemblyName):需要输入Assembly的全名称(包括name, version, culture, public key token),该种加载调用Assembly resolver,并基于以下策略来定位相应的Assembly:
1. Assembly是否有public key,如果没有直接到Probing (step 5),如果有则应用version policy
2. 基于version policy,也就是.config文件种的assemblyBinding元素下assembly定位的信息;
3. 如果无法通过version policy定位,则在GAC种查找;
4. 如果无法在GAC中定位assembly,codeBase来定位,如果通过codeBase找到的文件不匹配,则失败;
5. 如果无法通过codeBase定位,则通过probing方式来查找,如果找到的文件不匹配,则失败。
6. 在第一步之前应该还可以在DEVPATH系统变量中查找,但一般这只是给开发者用的而不是在部署时用的,所以可以忽略不计。
以上两种方式表面上类似,但一个是调用Loader,一个调用Resolver,实际差别很大。
posted on 2004-06-07 16:52 BB Programming 阅读(1733) 评论(1) 编辑 收藏 举报