2009-12-24 52 views
3

我發現自己處於令人討厭的情況,即在調試會話完成後,visual studio調試器不能自行釋放。因此,devenv.exe的保留對可執行文件的鎖,我不能重建項目,由於可怕的錯誤:以後每運行週期是不強制Visual Studio 2008調試器發佈可執行文件

Error 1 Unable to copy file "obj\Debug\program.exe" to "bin\Debug\program.exe". The process cannot access the file 'bin\Debug\program.exe' because it is being used by another process.

這可以通過重新啓動Visual Studio中,但重新啓動我的整個IDE固定恰好有利於良好的編碼環境。建立 - >清潔沒有幫助。

我google了這個錯誤,雖然症狀似乎是相當普遍的基本原因是不同的。主要我想知道,按重要性排序:

  1. 是否有任何快速的方法來解鎖文件,而無需重新啓動Visual Studio?
  2. 除此之外,我應該採用什麼防禦性編程技術來防止這種情況?
  3. 在下面的例子中幕後究竟發生了什麼,導致調試器不能釋放?

一個會產生這種症狀的代碼的例子就在這裏。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var f1 = new Form1(); 
     f1.Dir = "asdf"; 
    } 
} 

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private FileSystemWatcher fsw; 

    public string Dir 
    { 
     get { return fsw.Path;} 
     set 
     { 
      fsw = new FileSystemWatcher(value); 
      fsw.EnableRaisingEvents = true; 
      throw new Exception("asdf"); 
     } 
    } 

    ~Form1() 
    { 
     if (fsw != null) 
      fsw.Dispose(); 
    } 
} 

重現:

  1. 運行Program.Main使用Visual Studio 2008中的調試器。
  2. 當拋出異常時停止調試。
  3. 更改源代碼並嘗試重建。

編輯:各種各樣的解決方案:

public Form1() 
{ 
    InitializeComponent(); 
    this.Closing += (sender, args) => 
    { 
     if (watcher != null) 
      watcher.Dispose(); 
    }; 
} 

我仍然有興趣在爲什麼這個工作,並同時將其放置在析構函數沒有。

+0

您使用的是Windows 7嗎? – 2009-12-24 16:11:43

+0

沒有。帶有VS 9.0.30729.1 SP的Windows XP SP3。這是爲.NET 3.5 SP1構建的項目 – fostandy 2009-12-24 16:23:53

回答

1

攻擊這個問題的方法之一,你應該在你的工具帶中作爲開發人員的方法是使用MS/Sys Internals中的Process Explorer。它的一個功能允許您搜索系統中打開的手柄,並在發現時殺死手柄。這是一個非常方便和免費的應用程序。現在,這並不能解決你的核心問題,但它會有幫助。

+0

謝謝。是的,這是什麼證實它是devenv.exe是鎖定它。 – fostandy 2009-12-24 16:24:26

+0

你是否試過在文件上殺死Dev Env的文件句柄來釋放它? – 2009-12-24 16:26:57

+0

啊不,我沒有。我剛剛走了。雖然句柄不再顯示在進程資源管理器搜索中,我也不能在devenv.exe進程下看到它,但我仍然無法生成項目或手動刪除文件。 – fostandy 2009-12-24 16:34:01

0

我以前也有這個問題。

運行使用.bat:

taskkill /F /IM program.exe 
taskkill /F /IM program.vshost.exe 

通常解決我的問題......

0

你不是一個終結處置?終結器由機器管理,而開發人員負責處理。 Finalzers是非確定性的,而處置是確定性的。

也許你可以嘗試在表單的「Disposed」事件中處理。

0

不要使用析構函數~。不要在析構函數中調用Dipose()

相關問題