195 votes

La construction de Visual Studio échoue : impossible de copier le fichier exe à partir de l'obj. \debug à la poubelle \debug

Mise à jour : Un exemple de projet reproduisant ce bogue peut être trouvé ici à Microsoft Connect . J'ai également testé et vérifié que la solution donnée dans le document la réponse acceptée ci-dessous fonctionne sur cet exemple de projet. Si cette solution ne fonctionne pas pour vous, vous avez probablement un autre problème (qui fait l'objet d'une question distincte).


Il s'agit d'une question déjà posée, à la fois ici sur Stack Overflow et à d'autres endroits, mais aucune des suggestions que j'ai trouvées jusqu'à présent ne m'a aidé, alors je dois essayer de poser une nouvelle question.

Scénario : J'ai une application Windows Forms simple (C#, .NET 4.0, Visual Studio 2010). Elle possède quelques formulaires de base dont la plupart des autres formulaires héritent, elle utilise Entity Framework (et les classes POCO) pour l'accès aux bases de données. Rien d'extraordinaire, pas de multithreading ou autre.

Problème : Tout allait bien pendant un certain temps. Puis, tout à coup, Visual Studio n'a pas réussi à construire l'application alors que j'étais sur le point de la lancer. J'ai reçu l'avertissement suivant "Impossible de supprimer le fichier '...bin \Debug\ Nom du projet].exe'. Accès au chemin '...bin \Debug\ [Nom du projet].exe' est refusé." et l'erreur "Impossible de copier le fichier 'obj \x86\Debug\ [Nom du projet].exe" en "bin". \Debug\ Nom du projet].exe'. Le processus ne peut pas accéder au fichier 'bin \Debug\ [Nom du projet].exe' parce qu'il est utilisé par un autre processus". (J'obtiens à la fois l'avertissement et l'erreur lors de l'exécution de Rebuild, mais seulement l'erreur lors de l'exécution de Build - je ne pense pas que cela soit pertinent ?)

Je comprends parfaitement ce que disent les messages d'avertissement et d'erreur : Visual Studio essaie manifestement d'écraser le fichier exe tout en le verrouillant pour une raison quelconque. Cependant, cela ne m'aide pas à trouver une solution au problème... La seule chose que j'ai trouvé qui fonctionne est de fermer Visual Studio et de le relancer. La construction et le lancement fonctionnent alors, jusqu'à ce que je fasse un changement dans certains des formulaires, puis j'ai à nouveau le même problème et je dois redémarrer... C'est assez frustrant !

Comme je l'ai mentionné plus haut, ce problème semble être connu, et de nombreuses solutions ont été proposées. Je vais simplement énumérer ce que j'ai déjà essayé ici, pour que les gens sachent ce qu'il faut éviter :

  • Créer une nouvelle solution propre et copier simplement les fichiers de l'ancienne solution.

  • Ajout de ce qui suit à l'événement de pré-construction du projet :

     if exist "$(TargetPath).locked" del "$(TargetPath).locked"
        if not exist "$(TargetPath).locked" if exist "$(TargetPath)" move "$(TargetPath)" "$(TargetPath).locked"
  • Ajoutez ce qui suit aux propriétés du projet (fichier .csproj) :

     <GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies>

Cependant, aucune d'entre elles n'a fonctionné pour moi, alors vous pouvez probablement comprendre pourquoi je commence à être un peu frustré. Je ne sais pas où chercher, alors j'espère que quelqu'un a quelque chose à me donner ! S'agit-il d'un bogue dans VS, et si oui, existe-t-il un correctif ? Ou ai-je fait quelque chose de mal, ai-je une référence circulaire ou autre, et si oui, comment puis-je le découvrir ?

Toute suggestion est la bienvenue :)

Mise à jour : Comme mentionné dans le commentaire ci-dessous, j'ai également vérifié à l'aide de Process Explorer qu'il s'agit bien de est Visual Studio qui verrouille le fichier.

4 votes

Avez-vous vérifié si votre application se ferme correctement ? Le gestionnaire de tâches vous montre-t-il [ProjectName].exe dans la liste des processus ?

2 votes

J'ai déjà eu ce problème auparavant et j'ai simplement renommé le fichier en .old etc. et relancé la construction. Ce n'est pas vraiment une solution, je sais, mais ça a marché pour moi.

0 votes

@miensol : Oui, il semble se fermer correctement. J'obtiens "Le programme '[1848] [ProjectName].vshost.exe : Managed (v4.0.30319)' s'est terminé avec le code 0 (0x0)". @Barry : renommer le fichier exe dans bin \Debug fonctionne, mais comme vous l'avez dit, ce n'est pas vraiment une solution et ce sera assez ennuyeux de devoir le faire à chaque fois. C'est quand même mieux que de redémarrer Visual Studio...

117voto

drharris Points 6747

Cela va vous paraître stupide, mais j'ai essayé toutes ces solutions, en utilisant VS2010 sur Windows 7. Aucune d'entre elles n'a fonctionné, à l'exception du renommage et de la construction, qui étaient pour le moins TRÈS fastidieux. Finalement, j'ai trouvé le coupable, et je trouve cela difficile à croire. Mais j'utilisais le code suivant dans AssemblyInfo.cs...

[assembly: AssemblyVersion("2.0.*")]

C'est assez courant, mais pour une raison quelconque, le passage à la version 2.0.0.0 a permis de rétablir la situation. Je ne sais pas si c'est une spécificité de Windows 7 (je ne l'utilise que depuis 3-4 semaines), ou si c'est aléatoire, ou quoi, mais cela a réglé le problème pour moi. Je suppose que VS gardait un œil sur chaque fichier qu'il générait, afin de savoir comment incrémenter les choses ? Je ne suis vraiment pas sûr et je n'ai jamais vu cela se produire auparavant. Mais si quelqu'un d'autre s'arrache les cheveux, essayez-le.

12 votes

C'est une idée folle, je te l'accorde ;) Ce qui est encore plus fou, c'est que ça a l'air de fonctionner ! Je l'ai testé plusieurs fois maintenant, et je peux confirmer que lorsque j'utilise une version d'assemblage comme "2.0.*", j'obtiens l'erreur. j'obtiens l'erreur, mais quand j'utilise plutôt "2.0.0", cela fonctionne comme un charme ! Je demande instamment à d'autres personnes de tester cela, et si vous trouvez que cela fonctionne, veuillez voter pour cette réponse, car c'est quelque chose qui doit être connu ! J'espère que Microsoft s'en rendra compte... Merci drharris :)

0 votes

Je suis si heureuse que ça ait marché pour vous aussi ! Je n'ai toujours aucune idée de ce qui peut causer ce problème. J'ai ouvert les permissions des fichiers et des dossiers, supprimé autant de fichiers .resx que possible, utilisé des actions avant et après la construction, mis cette ligne Lock dans le fichier du projet, créé une toute nouvelle solution et rétabli la version précédente dans Subversion. Rien de tout cela n'a fonctionné, et j'ai simplement essayé ceci, pour le remettre dans un état aussi "par défaut" que possible. Bien sûr, cela a fonctionné, mais je n'ai aucune idée de la raison.

2 votes

Cela n'a pas fonctionné pour moi, lorsque j'ai redémarré VS, je n'ai pas eu d'erreur pendant un certain temps. Chaque fois que j'obtiens cette erreur, je dois redémarrer VS 2010.

14voto

Nailuj Points 7283

Comme je n'ai pas reçu d'autres commentaires sur cette question, j'ai pensé que je pourrais simplement partager ce qui a été ma solution :

Comme l'a suggéré Barry dans un commentaire de l'article original, il est possible de renommer manuellement le fichier d'aide à l'écriture. '...bin \Debug Nom du projet].exe à quelque chose d'autre (par exemple '[Nom du projet]1.exe'. ) est une solution de contournement (je ne suis cependant pas autorisé à supprimer le fichier moi-même, et je dois dire que je trouve cela un peu bizarre car on pourrait croire que le même verrou empêchant la suppression empêcherait aussi le renommage...). Ce n'est pas une bonne solution, mais c'est raisonnablement rapide (du moins après l'avoir fait plusieurs fois, cela devient presque une routine), et en tout cas beaucoup plus rapide que de redémarrer Visual Studio, ce que j'ai fait au début.

Au cas où quelqu'un se poserait la question, je pourrais aussi ajouter que je ne vois ce problème que de façon semi-aléatoire. Il se produit généralement après que j'ai effectué des modifications dans le mode de conception d'un formulaire (mais pas toujours). Il ne se produit généralement pas si je ne modifie que le code de la logique d'entreprise ou le code non lié à l'aspect visuel (mais parfois si...). Frustrant en effet, mais au moins j'ai un hack qui fonctionne pour moi - espérons juste que mon prochain projet ne sera pas confronté à ce problème aussi...

@Barry : si vous souhaitez être crédité pour votre commentaire, n'hésitez pas à le poster comme réponse et je m'assurerai de l'accepter :)

0 votes

J'ai voté cette proposition car c'est ce que j'ai fait dans le passé. Je suis d'accord, c'est une solution sale mais elle fonctionne. VS a eu ce problème pendant quelques itérations. Je charge également mon projet depuis un répertoire réseau. Il a été entièrement sécurisé, mais cela n'a pas d'importance. Cela n'a pas d'importance si c'est un mappage de lecteur ou un UNC non plus. Oui, MS a vraiment besoin de corriger ce problème. Ils ont un bogue fermé pour cela, disant qu'il est impossible de le reproduire. C'est nul !

14voto

Pedro Points 1656

J'ai trouvé une solution simple, il suffit de désactiver les services d'indexation de Windows pour le dossier du projet et ses sous-dossiers.

2 votes

Cela a marché pour moi aussi. Je ne suis pas sûr de comprendre pourquoi, car l'explorateur de processus a montré que devenv.exe tenait la poignée de verrouillage. Néanmoins, désactiver l'indexation a réglé le problème.

1 votes

@Fopedush J'ai rencontré ce problème avec la même solution, bien que je n'aie pas vu cette question à l'époque. Cette réponse a une explication sur le pourquoi de cette aide.

1 votes

Celui-là l'a fait pour moi.

12voto

Sergey Points 101

J'ai le même problème (MSB3021) avec un projet WPF dans VS2008 (sur Windows 7 x32). Le problème apparaît si j'essaie de relancer l'application trop rapidement après l'exécution précédente. Après quelques minutes, le fichier exe se débloque de lui-même et je peux relancer l'application. Mais une pause aussi longue me met en colère. La seule chose qui m'a vraiment aidé a été de lancer VS en tant qu'administrateur.

1 votes

J'ai trouvé ce rapport de bogue récent sur ce problème exact : connect.microsoft.com/VisualStudio/feedback/details/558848/ Ce rapport de bogue fournissait un exemple de projet qui permettait de reproduire le bogue. La solution suggérée par drharris a également fonctionné (voir la solution de contournement postée dans le lien ci-dessus pour une solution étape par étape pour l'exemple de projet).

0 votes

C'est la seule solution qui a fonctionné pour moi aussi. Merci @Nailuj !

0 votes

C'est certainement plus facile que de redémarrer VS.

8voto

Eight-Bit Guru Points 4613

J'ai essayé toutes les autres suggestions dans les réponses ici, aucune n'a fonctionné. Finalement, j'ai utilisé Process Monitor pour découvrir que mon .exe que VS2010 ne parvenait pas à construire était verrouillé par le processus System (PID=4). En cherchant dans SO des situations impliquant ceci, j'ai trouvé ce réponse.

En résumé : si vous avez désactivé le service Application Experience (comme je l'ai fait), réactivez-le et démarrez-le. Deux ans d'ennuis sont terminés.

0 votes

+1 J'avais déjà essayé tout le reste (1. le gestionnaire de tâches, 2. l'explorateur de processus, c'est-à-dire fermer la poignée, ce que Windows ne me laissait pas faire, 3. la désactivation de l'antivirus, 4. l'exclusion de APP_DATA/Local/Microsoft/Visual Studio du service d'indexation de Windows), mais ce conseil concernant le service "Application Experience" est le seul qui m'a évité de me taper la tête contre le mur. Je l'ai activé et le problème a disparu. Le plus drôle, c'est qu'après l'avoir désactivé à nouveau, tout était toujours OK. Je n'ai pas eu d'autres problèmes. Mais c'est définitivement la seule chose qui a réglé le problème pour moi.

0 votes

Ça marche pour moi aussi ! !! La seule autre chose qui fonctionne aussi est de supprimer le fichier bin avant d'exécuter l'application, mais vous devez toujours supprimer avant l'exécution, très ennuyeux.

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