2013-07-24 77 views
3

我加載使用Assembly.LoadFrom保持一個打開的文件句柄?

Assembly.LoadFrom("path.exe"); 

另一組裝之後,我似乎無法刪除的文件系統的exe。所以我想知道如果這個路徑保持一個打開的文件句柄,我怎麼能關閉它?

+0

刪除* *當*?當你的程序結束或者它仍在運行時? – m0skit0

+0

@ m0skit0:它仍在運行時。當我知道我不再需要這個裝配中的任何東西時。 – clamp

回答

6

是的,它是開放的,直到程序集從appdomain卸載。

如果確實需要刪除文件,請將其內容加載到內存中。使用Assembly.Load(byte[])加載程序集:

using (Stream stream = File.OpenRead("path.exe")) 
{ 
    byte[] rawAssembly = new byte[stream.Length]; 
    stream.Read(rawAssembly, 0, (int)stream.Length); 
    Assembly.Load(rawAssembly); 
} 
+0

謝謝,我該如何卸載它? – clamp

+0

和另一個問題:如果我碰巧加載相同的程序集兩次,是否會打開另一個文件句柄或將它重用第一個? – clamp

+0

你不能卸載它,而不卸載整個AppDomain。用'AppDomain.Unload()'。 –

2

默認情況下,文件將被鎖定,但.NET有一個稱爲卷影副本功能,在它將使組件的副本,並將其加載代替。 ASP.NET依靠此來使網站能夠更新而不會遇到這些鎖定問題。

有關詳細信息,請參閱MSDN上的Shadow Copying Assemblies主題。

相關問題