2009-12-24 6 views
3

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:

  1. 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?
  2. 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:

  1. Exécuter Program.Main en utilisant le débogueur Visual Studio 2008.
  2. Arrête le débogage lorsque l'exception est levée.
  3. 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.

+0

Utilisez-vous Windows 7? –

+0

Non. Windows XP SP3 avec VS 9.0.30729.1 SP. Ceci est un projet construit pour .NET 3.5 SP1 – fostandy

Répondre

1

Une façon d'attaquer ce problème et une que vous devriez avoir dans votre toolbelt en tant que développeur est d'utiliser Process Explorer de MS/Sys Internals. L'une de ses caractéristiques vous permet de rechercher toutes les poignées ouvertes dans un système et, lorsqu'elles sont trouvées, de tuer la poignée. C'est une application très pratique et gratuite. Maintenant, cela ne résout pas votre problème de base, mais cela vous aidera.

+0

Merci. Oui, c'est ce qui a confirmé que c'était devenv.exe qui le bloquait. – fostandy

+0

Et avez-vous essayé de tuer le gestionnaire de fichiers de Dev Env sur le fichier pour le libérer? –

+0

Ah non je ne l'ai pas fait. Je viens juste de partir. Alors que le handle n'apparaît plus dans la recherche de l'explorateur de processus, je ne peux pas non plus le voir sous le processus devenv.exe, je ne suis toujours pas capable de construire le projet ou de le supprimer manuellement. – fostandy

0

J'avais l'habitude d'avoir ce problème aussi.

Exécution d'un .bat avec:

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

généralement résoudre mes problèmes ...

0

N'êtes-vous pas dans un finaliseur Mise au rebut? Les finaliseurs sont gérés par la machine, tandis que les développeurs sont responsables de l'élimination. Les finalzers sont non-déterministes, alors que les disposer sont déterministes.

Peut-être que vous pourriez essayer la disposition dans l'événement "Disposé" du formulaire.

0

N'utilisez pas de destructeur ~. N'appelez pas Dipose() dans le destructeur.

Questions connexes