强制Visual Studio 2008调试程序以释放可执行文件

时间:2009-12-24 16:10:16

标签: c# visual-studio-2008 debugging

我发现自己处于烦人的情况,即Visual Studio调试器在调试会话结束后不会干净地释放自己。因此,devenv.exe保留对可执行文件的锁定,由于可怕的错误,我无法重建项目:

  

错误1无法将文件“obj \ Debug \ program.exe”复制到“bin \ Debug \ program.exe”。该进程无法访问文件'bin \ Debug \ program.exe',因为它正由另一个进程使用。

这可以通过重新启动visual studio来解决,但是在每个运行周期后重新启动我的整个IDE并不完全有利于良好的编码环境。构建 - >清洁无济于事。

我用谷歌搜索了这个错误,虽然症状似乎相当普遍,但潜在的原因是多种多样的。主要是我想知道,按重要性顺序:

  1. 有没有快速的方法让文件解锁而不重新启动visual studio?
  2. 除此之外,我应该采用什么防御性编程技术来防止这种情况发生?
  3. 下面示例中的幕后究竟是什么导致调试器无法释放?
  4. 此处会产生此症状的代码示例。

    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. 使用Visual Studio 2008调试器运行Program.Main。
    2. 抛出异常时停止调试。
    3. 更改源代码并尝试重建。
    4. 编辑:各种解决方案:

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

      我仍然对为什么这种方法有效并且将它放在析构函数中不感兴趣。

4 个答案:

答案 0 :(得分:1)

攻击此问题的一种方法是作为开发人员在工具箱中应该使用的一种方法是使用MS / Sys Internals中的Process Explorer。它的一个功能允许您搜索ll系统中的打开句柄,并在找到时杀死句柄。这是一个非常方便和免费的应用程序。现在,这并不能解决你的核心问题,但它会有所帮助。

答案 1 :(得分:0)

我以前也遇到过这个问题。

使用以下命令运行.bat:

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

通常可以解决我的问题...

答案 2 :(得分:0)

你不是在处理终结者吗?终结器由机器管理,而开发人员负责处理。终结者是非确定性的,而处置是确定性的。

也许你可以在表格的“Disposed”事件中尝试处理。

答案 3 :(得分:0)

不要使用析构函数~。不要在析构函数中调用Dipose()