当前位置: 首页 > 工具软件 > .NET Assembly > 使用案例 >

在.Net framework中动态加载Assembly的loadFromRemoteSources配置

蒋健
2023-12-01

简介

在插件类型的应用开发中,我们可能会在程序中动态加载一个assembly文件,创建其中的类对象并使用。
这时,就涉及到了CAS(code access security)和信任沙盒。
一般,我们的应用开发中,使用其他的库时,会在代码中直接引入,并编码使用。但如果我们不是在编译时引用,而是在应用时动态加载该库文件,解析出class和类型,并进一步使用。这时,库文件可能被篡改,导致错误和安全。那么如果需要后期加载,在DotNet要求我们提供我们的Trust配置。

配置

在应用的配置中,添加loadFromRemoteSources项;

这个配置如下层次:

<configuration>
   <runtime>
      <loadFromRemoteSources enabled="true"/>
   </runtime>
</configuration>

loadFromRemoteSources说明

在.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,则使用完全信任模式。

  • 但在4.5版本中,本地网络中的assembly文件,缺省模式下时完全信任执行的。
  • 可以使用**Assembly.UnsafeLoadFrom()**来加载assembly,这会跳过一些安全检测,也会把来自网络的assembly看做本地的assembly。 OS会把来自网络的assembly标示为internet assembly,即使已经下载保存在本地了。

其他说明

缺省下,在.Net Framework 4级以后的版本,CAS 策略是disabled,也只有在CAS为disabled时, loadFromRemoteSources 设置为true才能有效。

抛出异常的情况

如果loadFromRemoteSources没有设置为true,在下面的情形下,会有异常抛出:

  • 使用的assembly不是在MyComputer的zone中。
  • 在.Net Framework 3.5版本中,当前应用的domain的沙盒行为和assembly的行为不同。此时CAS 策略要关闭,而且当前的domain没有在沙盒中。

另外的解决方法:

  • 使用Assembly.UnsafeLoadFrom
Assembly a = Assembly.UnsafeLoadFrom(strDllName);

-使用Assembly a = Assembly.Load(byte[] codeBytes)

byte[] assemblyBuffer = File.ReadAllBytes(strDllFileName);
Assembly a = Assembly.Load(assemblyBuffer);  
 类似资料: