79 votes

Visual Studio verrouille le fichier de sortie lors de la construction

J'ai une solution WinForms simple dans VS 2010. Chaque fois que je la construis, le fichier de sortie (bin \debug\app.exe ) finit par être verrouillé, et les constructions suivantes échouent avec un message du type "The process cannot access the file 'bin\Debug\app.exe' because it is being used by another process." La seule façon de construire le projet est de redémarrer VS après chaque construction, ce qui est très maladroit.

J'ai trouvé ce vieux billet de blog http://blogs.geekdojo.net/brian/archive/2006/02/17/VS2005FileLocking.aspx - il semble que le problème soit très ancien. Quelqu'un sait-il ce qui se passe ici, ou au moins une solution de contournement ?

Mise à jour

Je n'ai pas vraiment exécuter le dossier. Le verrouillage se produit après la construction, pas après le débogage (c'est-à-dire démarrer VS - construire - construire - échouer !) Et j'ai essayé de désactiver l'antivirus. Cela n'aide pas.

Mise à jour 2

L'explorateur de processus montre que devenv.exe a chargé le fichier (dans DLLs, pas dans Handles). Il semble qu'un problème pendant la construction ait empêché le déchargement, mais la (première) construction se termine sans autre message que "1 succeeded, o failed"/.

69voto

Stormenet Points 8695

J'ai eu le même problème, mais j'ai trouvé une solution (merci à Keyvan Nayyeri ):

Mais comment résoudre ce problème ? Il existe plusieurs façons de procéder en fonction du type de projet, mais une solution simple que je recommande aux développeurs de modules complémentaires Visual Studio consiste à ajouter un code simple aux événements de construction de leur projet.

Vous pouvez ajouter les lignes de code suivantes à la ligne de commande de l'événement de pré-construction de votre projet.

if exist "$(TargetPath).locked" del "$(TargetPath).locked"
if exist "$(TargetPath)" if not exist "$(TargetPath).locked" move "$(TargetPath)" "$(TargetPath).locked"

24voto

Vladimir Datsyuk Points 151

Ce n'est pas un problème de virus. C'est un bug de Visual Studio 2010. Il semble que le problème soit lié à l'utilisation de Visual Studio Gui Designer.

La solution consiste à déplacer le fichier de sortie verrouillé vers un autre fichier temporaire lors de l'événement de pré-construction. Il est logique de générer le nom du fichier temporaire de manière aléatoire.

del "$(TargetPath).locked.*" /q 
if exist "$(TargetPath)"  move "$(TargetPath)" "$(TargetPath).locked.%random%"
exit /B 0

En cas d'utilisation de noms de fichiers temporaires constants, vous ne ferez que repousser les verrous :

Cette solution de contournement fonctionne exactement une fois

 if exist "$(TargetPath).locked" del "$(TargetPath).locked"
    if exist "$(TargetPath)" if not exist "$(TargetPath).locked" move "$(TargetPath)" "$(TargetPath).locked"

J'ai également trouvé une solution avec 2 fichiers temporaires qui fonctionne exactement 2 fois.

6voto

Shani Elharrar Points 342

Le problème s'est posé à moi aussi.

Mon scénario était le suivant : J'utilise Windows 7 (mais cela peut aussi arriver sous Windows XP) et, tout en travaillant sur un projet avec un contrôle utilisateur WPF, j'ai pu construire toutes les fois, jusqu'à l'ouverture du fichier XAML du contrôle utilisateur - A partir de là, j'ai une construction, puis les fichiers sont verrouillés.

J'ai également remarqué que j'exécutais Visual Studio (Devenv.exe) en tant qu'administrateur, J'ai commencé à exécuter Visual Studio sans les privilèges d'administrateur et le problème a disparu ! .

Faites-moi savoir si cela vous a aidé aussi. Bonne chance.

3voto

naivists Points 15639

Qu'en est-il des scanners de virus sur votre machine ? Pouvez-vous voir les processus qui détiennent des poignées sur votre fichier (utilisez la fonction Explorateur de processus pour le savoir) ?

Peut-être que "app.exe" est visible dans votre liste de processus, c'est-à-dire que la dernière version que vous avez déboguée est toujours en cours d'exécution ? Lorsque vous développez des applications qui ont plusieurs threads, cela peut se produire si vous n'avez pas join tous.

3voto

McAden Points 7657

J'ai vu cela soit sur un logiciel d'analyse de virus gourmand, soit si app.exe ne se ferme pas correctement. Assurez-vous que le processus n'est pas encore en cours d'exécution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X