2013-09-21 27 views
3

我正在處理一個任務,在這個任務中,我必須加載dll並從類名等獲得一些信息......但是當我將該dll加載到我的代碼中時,鎖定,無法從源代碼構建,直到我關閉加載程序,我已經試過某些解決方案,但沒有人對我的作品在.net中加載dll而不鎖定它

  1. 影拷貝:在這種情況下,當我的卷影副本,然後組裝後,如果我已經改變了
    我的主DLL,它仍然是我的加載應用程序中的舊東西。

  2. System.Reflection.assembly.loadfrom(System.IO.GetBytes(「asm-path」)); //工作有時但不總是

  3. System.Reflection.assembly.ReflectionOnlyConext(); //不工作

有沒有妥善解決這一

+1

Assembly.LoadFrom()不具有重載以字節[]和有一定沒有名爲GetBytes會()中System.IO方法。相當sl research的研究。 Assembly.Load(byte [])肯定無法鎖定文件。不要使用它。 –

回答

18

其中一種方法是讀取文件的字節並使用Assembly.Load的重載,該重載的字節數組類似於第二個示例中的內容。我不確定System.IO.GetBytes是什麼,而是嘗試File.ReadAllBytes

byte[] assemblyBytes = File.ReadAllBytes("asm-path"); 
var assembly = Assembly.Load(assemblyBytes); 

不過,這可能是不夠取決於你想做的事,因爲它被加載後,您不能卸載的組件是什麼。要解決此問題,如果需要,可以將程序集加載到自己的AppDomain中,然後在完成後卸載AppDomain。

AppDomain ad = AppDomain.CreateDomain("New_Assembly_AD"); 
byte[] assemblyBytes = File.ReadAllBytes("asm-path"); 
var assembly = ad.Load(assemblyBytes); 

一旦你與assembly完對象後,您可以卸載的AppDomain。

AppDomain.Unload(ad); 
+0

帶影子副本的AppDomain是您正確完成此操作的唯一方法。 –

+1

新的appdomain是唯一的理智的方法...注意,反射必須在新的AppDomain中完成,以避免泄漏到原始域中的類型(這會將程序集加載到原始域中,並且所有的努力都被浪費)。 –

+0

@AlexeiLevenkov - 良好的調用明確指出,應該在新的AppDomain中完成工作,謝謝。 – keyboardP

1

也許只是嘗試釋放文件,你檢查的信息後? 這樣,它可能會被鎖定幾毫秒。

如果這不起作用。複製DLL並使用副本...

如果你想刷新信息,每當DLL改變,你可以編寫一個目錄監聽器,並在原始DLL已更新時做一些事情。