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...
0 votes
Cela se produit-il également sur une solution Windows Forms propre ? Nouveau projet -> Windows Forms -> Construire, exécuter, arrêter, reconstruire ?
0 votes
@Patrick : non, cela ne se produit pas sur une solution propre.
2 votes
@Naliluj : Je suis tombé sur ce article d'un forum Microsoft qui explique que cela peut être lié aux fichiers de ressources. Si vous utilisez des fichiers resx, cela pourrait vous donner un indice.
0 votes
@Patrick : J'ai déjà rencontré cet article plusieurs fois. Je n'ai que le fichier resx par défaut (et il est même vide). Aussi, les solutions de contournement suggérées par l'article sont le "if exist $(TargetPath).locked" et le "GenerateResourceNeverLockTypeAssemblies". Les deux ont été essayées, mais aucune d'entre elles n'a fonctionné :(
0 votes
@fearofawhackplanet : Non, ce n'est pas le cas (et juste pour écarter l'option à 100%, je l'ai même vidé mais ça ne l'a pas amélioré)....
1 votes
Pour la postérité, j'ai eu ce problème et il a été résolu en ajoutant l'élément <GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies> à mon fichier csproj.
0 votes
@ThisIsDave : comme vous pouvez le voir dans ma question, c'est l'une des solutions suggérées que j'ai trouvées en cherchant, mais elle n'a pas fonctionné dans mon cas.
0 votes
Merci de m'avoir prévenu ! J'ai protégé la question et supprimé les réponses "moi aussi".
0 votes
Cette solution n'a pas fonctionné pour moi. J'ai essayé de changer l'un ou l'autre et les deux AssemblyVersion et AssemblyFileVersion.
0 votes
Quelque chose de probablement très proche (mêmes messages MSBuild) dans les forums SharpDevelop : filetage
0 votes
Il est utilisé par un autre processus. Parfois, même si vous fermez le projet dans Visual Studio, le fichier est toujours verrouillé. Quitter Visual Studio (et tout autre processus qui utilise ces fichiers) devrait aider.
0 votes
la pré-construction a même fonctionné parfaitement, merci