在.Net framework中动态加载Assembly的loadFromRemoteSources配置
簡介
在插件類型的應用開發中,我們可能會在程序中動態加載一個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.Load(byte[] codeBytes)
byte[] assemblyBuffer = File.ReadAllBytes(strDllFileName); Assembly a = Assembly.Load(assemblyBuffer);總結
以上是生活随笔為你收集整理的在.Net framework中动态加载Assembly的loadFromRemoteSources配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在VS.NET 的项目中使用生成事件
- 下一篇: python中的logger之一