2009-10-19 45 views
3

我試圖加載程序集而不鎖定文件。這些程序集可能是第三方程序集,因此我們不一定有權訪問代碼,其中一兩個程序使用Assembly.Location從目錄讀取文件,這些文件可能依賴於它們。Assembly.Load(Byte [])和Assembly.Location/Assembly.Codebase

我知道你可以通過陰影複製來做到這一點,但真正讓它正常工作並且某些論壇上的某些用戶建議將程序集加載到字節數組並使用Assembly.Load(Byte []) )過載。直到其中一個程序集嘗試訪問其父目錄中的文件時,它才能正常工作,因爲Assembly.Location返回一個空字符串,而Assembly.Codebase返回加載程序集的應用程序的位置。

有什麼我可以做的,以某種方式設置我正在加載的程序集的代碼庫或位置屬性?在Codebase和Location的MSDN文檔中,它們被定義爲可覆蓋的屬性 - 這是否意味着我可以從宿主應用程序覆蓋它們?

+1

大概影子應對將是最好的解決方案... – Restuta 2009-10-19 12:56:04

+0

@Restuta,我同意。 – 2009-10-19 13:01:08

回答

1

您能使用AppDomainSetup.ApplicationBase嗎?或者您是否需要爲每個加載的組件定義路徑?

編輯:使用的文件名很容易定義代碼庫:

AssemblyName assemblyRef = new AssemblyName(); 
assemblyRef.CodeBase = assemblyFile; 
Assembly assembly = Assembly.Load(assemblyRef); 

也許你可以使用AppDomain.AssemblyLoadAssembly.ModuleResolve事件,但我對此表示懷疑。

+0

每個加載的程序集都將從不同的路徑加載,因此每個程序集都需要不同的位置或代碼庫屬性。 – 2009-10-19 13:07:29

+0

問題是使用文件名會鎖定程序集dll,並阻止它被文件系統刪除(或者更重要的是,被覆蓋)。 – 2009-10-19 13:29:25

+0

考慮我在CodeProject上創建的這篇文章:http://www.codeproject.com/KB/WCF/generic_wcf_host.aspx;該控制檯主機不會鎖定您的程序集 – 2009-10-19 13:33:03

0

使用::

var assembly = Assembly.ReflectionOnlyLoad(System.IO.File.ReadAllBytes(yourFullfileNamePath));

但你仍然要做到這一點在不同的AppDomain。