在插件类型的应用开发中,我们可能会在程序中动态加载一个assembly文件,创建其中的类对象并使用。
这时,就涉及到了CAS(code access security)和信任沙盒。
一般,我们的应用开发中,使用其他的库时,会在代码中直接引入,并编码使用。但如果我们不是在编译时引用,而是在应用时动态加载该库文件,解析出class和类型,并进一步使用。这时,库文件可能被篡改,导致错误和安全。那么如果需要后期加载,在DotNet要求我们提供我们的Trust配置。
在应用的配置中,添加loadFromRemoteSources项;
这个配置如下层次:
<configuration>
<runtime>
<loadFromRemoteSources enabled="true"/>
</runtime>
</configuration>
在.Net Framework 3.5及之前的版本中,有赖于你的执行区域zone,你的应用如果加载了外部的库assembly,你的库可能执行在一个部分信任(partial trust)里。比如我们加载一个web网络上的assembly,那么气被加载到一个internet zone区域执行,并被赋予Internet的允许集合–其在一个internet的沙盒中执行。 缺省设置下,远程库文件不允许在.net framework 4版本及更新版本中,不允许执行。如果要执行,要么设置完全信任,要么创建一个队员的沙盒AppDomain来执行。
在.Net Framework 4及以后的版本中,你要么显式地为该assembly创建一个沙盒,要么完全地信任并执行。否则,会抛出异常。
在应用配置中的loadFromRemoteSources元素,用来指定在以前版本的.Net framework 中部分信任的库文件,在版本4或更新的版本中,是否使用完全信任模式。设置为true,则使用完全信任模式。
缺省下,在.Net Framework 4级以后的版本,CAS 策略是disabled,也只有在CAS为disabled时, loadFromRemoteSources 设置为true才能有效。
如果loadFromRemoteSources没有设置为true,在下面的情形下,会有异常抛出:
另外的解决方法:
Assembly a = Assembly.UnsafeLoadFrom(strDllName);
-使用Assembly a = Assembly.Load(byte[] codeBytes)
byte[] assemblyBuffer = File.ReadAllBytes(strDllFileName);
Assembly a = Assembly.Load(assemblyBuffer);