Я нахожусь в досадной ситуации, когда отладчик visual studio не освобождает себя после завершения сеанса отладки. Следовательно, devenv.exe сохраняет блокировку исполняемого файла, и я не могу перестроить проект из-за страшной ошибки:
Ошибка 1 Не удается скопировать файл "obj \ Debug \ program.exe" в "bin \ Debug \ program.exe". Процесс не может получить доступ к файлу «bin \ Debug \ program.exe», так как он используется другим процессом.
Это можно исправить, перезапустив Visual Studio, но перезапуская всю мою среду IDE после каждого цикла выполнения не совсем благоприятно для отличной среды программирования. Сборка -> Очистить не помогает.
Я погуглил эту ошибку, и хотя симптом кажется довольно распространенным, основная причина различна. Прежде всего, я хотел бы знать, в порядке важности:
- Есть ли какой-нибудь быстрый способ разблокировки файла без перезапуска Visual Studio?
- За исключением того, какие защитные методы программирования я должен использовать, чтобы предотвратить это?
- Что именно происходит за кулисами в приведенном ниже примере, из-за которого отладчик не выпускается?
Пример кода, который будет вызывать этот симптом, приведен здесь.
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();
}
}
Воспроизвести:
- Запуск Program.Main с использованием отладчика Visual Studio 2008.
- Прекратить отладку при возникновении исключения.
- Измените исходный код и попытайтесь восстановить.
Редактировать: своего рода решение:
public Form1()
{
InitializeComponent();
this.Closing += (sender, args) =>
{
if (watcher != null)
watcher.Dispose();
};
}
Мне все еще интересно, почему это работает, а при помещении его в деструктор - нет.