Принудительно отладчик Visual Studio 2008 для выпуска исполняемого файла - PullRequest
3 голосов
/ 24 декабря 2009

Я нахожусь в досадной ситуации, когда отладчик 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. Что именно происходит за кулисами в приведенном ниже примере, из-за которого отладчик не выпускается?

Пример кода, который будет вызывать этот симптом, приведен здесь.

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();
    };
}

Мне все еще интересно, почему это работает, а при помещении его в деструктор - нет.

Ответы [ 4 ]

1 голос
/ 24 декабря 2009

Один из способов решения этой проблемы, который вы должны иметь в своем наборе инструментов как разработчик, - это использовать Process Explorer от MS / Sys Internals. Одна из его функций позволяет вам искать все открытые дескрипторы в системе и, при обнаружении, уничтожать дескриптор. Это очень удобное и бесплатное приложение. Теперь это не решит вашу основную проблему, но поможет в этом.

0 голосов
/ 27 декабря 2010

Не используйте деструктор ~. Не звоните Dipose() в деструктор.

0 голосов
/ 27 декабря 2010

Разве вы не выбрасываете в финализатор? Финализаторы управляются машиной, а разработчики отвечают за утилизацию. Финализаторы являются недетерминированными, а утилизация - детерминированными.

Может быть, вы можете попробовать избавиться в событии «Уничтожено» формы.

0 голосов
/ 24 декабря 2009

Раньше у меня тоже была эта проблема.

Запуск .bat с:

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

обычно исправляю мои проблемы ...

...