频道栏目
读书频道 > web开发 > .NET > .NET安全揭秘
2.2.2 加载和卸载程序集
2012-10-24 15:35:51     我来说两句
收藏   我要投稿

本文所属图书 > .NET安全揭秘

全书共分为五个部分。第一部分:.NET安全基础,透彻讲解了.NET体系结构、程序集与反射、应用程序域和CLR寄宿等核心技术,这部分内容是.NET架构的核心,同时也是理解.NET底层安全机制的基础;第二部分:.NET平台安...  立即去当当网订购

我们已经知道如何反射一个已经加载到应用程序域的程序集了,那么如何自由地控制程序集的加载和卸载的问题就摆在了我们的面前。.NET同样为我们提供了相关的类型和方法来简化这样的操作。

1. 加载程序集的6种方法

方法1 Assembly.Load

该方法会有多个重载版本,其中一个就是提供程序集的详细信息,即程序集的标识,包括程序集的名称、版本、区域信息、公有密钥标记,全部都是以一个字符串的形式提供,例如“System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3”。

使用Assembly.Load加载程序集的顺序如下:首先它会去全局程序集缓存查找,然后到应用程序的根目录查找,最后会到应用程序的私有路径查找。

当然,如果使用的是弱命名程序集,即只给出程序集的名称,此时CLR将不会在程序集上应用任何安全或者部署策略,而且Load也不会到全局缓存程序集中查找程序集。

方法2 Assembly.LoadFile

该方法从指定路径的文件来加载程序集。

方法3 Assembly.LoadFrom

该方法从指定的路径来加载程序集,实际上该方法被调用的时候,CLR会打开这个文件,获取其中的程序集版本、语言文化、公钥标记等信息,把它们传递给 Load方法。然后,Load方法采用上面的策略来查找程序集。如果找到了,就和LoadFrom方法中指定的路径做比较。如果路径相同,该程序集会被认为是应用程序的一部分;如果路径不同或Load方法没有找到程序集,那么,该程序集只是作为一个“数据文件”来加载,不会被认为是应用程序的一部分。这就是在方法1中提到的Load方法比LoadFrom方法的执行效率高的原因。另外,由于可能把程序集作为“数据文件”来加载,所以使用 LoadFrom从不同路径加载相同程序集的时候会导致重复加载。当然,该方法会加载此程序集引用的其他程序集。

注意 Assembly.LoadFile只载入相应的dll文件,比如Assembly.LoadFile中("a.dll")加载a.dll,如果a.dll引用了b.dll,b.dll并不会被加载。Assembly.LoadFrom则会加载dll文件及其引用的dll,比如例子中的b.dll也会被加载。

方法4 Assembly.ReflectionOnlyLoad

该方法将程序集加载到反射上下文中,在反射上下文中可以检查类型但程序集不被执行。若要执行代码,还必须使用 Load 方法将程序集加载到执行上下文中。此外依赖项不会自动加载到只反射上下文中。

方法5 Assembly.ReflectionOnlyLoadFrom

它是Assembly.LoadFrom的只反射类型。将给定路径的程序集加载到只反射上下文中。依赖项不会自动加载到只反射上下文中。 不能执行加载到只反射上下文中的程序集的代码。若要执行代码,请使用 LoadFile 方法加载程序集。它的assemblyFile 参数必须引用不包含转义符的URI。此方法为 URI 中的所有无效字符提供转义符。为 assemblyFile 指定的路径是相对于当前目录的路径。此方法将该程序集加载到调用方的域。只反射上下文不同于其他上下文,加载到上下文的程序集只能通过卸载应用程序域来卸载。

方法6 Assembly.UnsafeLoadFrom

这是.NET Framework 4.0 新增的反射方法,加载一个程序集到当前上下文中,不通过任何安全检查。指定的参数是程序集的名称或者包含程序集清单的程序集的路径。从互联网上下载的程序集要先加载到安全沙箱执行,.NET 4.0则可直接执行,完全信任。

2. 卸载程序集

关于卸载程序集,本节只提出概念而不做介绍,因为CLR不提供卸载单独程序集的方法,只能卸载应用程序域。如果一个应用程序域被卸载了,该应用程序域中所有的程序集都将被卸载。第3章将讨论如何卸载应用程序域。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:2.2.1 反射程序集
下一篇:2.2.3 动态创建程序集
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站