Je me trouve dans la situation ennuyante où le débogueur de studio visuel ne se libère pas proprement une fois la session de débogage terminée. Par conséquent, devenv.exe conserve un verrou sur le fichier exécutable et je ne peux pas reconstruire le projet en raison de l'erreur redoutée:Force le débogueur Visual Studio 2008 pour libérer le fichier exécutable
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.
Cela peut être corrigé en redémarrant Visual Studio, mais le redémarrage de l'ensemble de mon IDE après chaque cycle d'exécution ne sont pas exactement propice à un excellent environnement de codage. Build -> Clean n'aide pas.
J'ai googlé cette erreur et tandis que le symptôme semble être assez commun la cause sous-jacente est variée. Principalement je voudrais savoir, par ordre d'importance:
- Y at-il un moyen rapide pour obtenir le fichier à déverrouiller sans redémarrer Visual Studio? À part cela, quelles techniques de programmation défensive dois-je utiliser pour éviter cela?
- Que se passe-t-il exactement dans les coulisses de l'exemple ci-dessous, ce qui empêche le débogueur de se libérer?
Un exemple de code qui produira ce symptôme est ici.
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();
}
}
Reproduire:
- Exécuter Program.Main en utilisant le débogueur Visual Studio 2008.
- Arrête le débogage lorsque l'exception est levée.
- Modifiez le code source et tentez de reconstruire.
Edit: une solution de toutes sortes:
public Form1()
{
InitializeComponent();
this.Closing += (sender, args) =>
{
if (watcher != null)
watcher.Dispose();
};
}
Je suis toujours intéressé à savoir pourquoi cela fonctionne et en le plaçant dans le destructor ne fonctionne pas.
Utilisez-vous Windows 7? –
Non. Windows XP SP3 avec VS 9.0.30729.1 SP. Ceci est un projet construit pour .NET 3.5 SP1 – fostandy