2010-02-09 5 views
5

J'ai une solution dans Visual Studio Express qui ressemble à ceci:Pourquoi "Copier si plus récent" ne copie pas un fichier lorsque le fichier est mis à jour?

La classe LogicSchema en C# qui analyser un fichier XML spécifié au moment de l'exécution. Ce qui suit est la méthode main de Program.cs:

LogicSchema ls = new LogicSchema(
    XDocument.Load(
     "schemas\\C#Schema.xml", 
     LoadOptions.PreserveWhitespace)); 

J'ai créé un dossier dans ma solution appelée « schémas » pour enregistrer le fichier XML et de l'Action de génération contenu et le « Copier Output Directory » valeur à être Copier si plus récent. Mon attente est que si vous ouvrez le fichier dans le bloc-notes, faites une modification et l'enregistrez, la version mise à jour du fichier XML sera copiée dans le répertoire ouput (dans ce cas, bin \ debug) quand j'appuie sur F5 . Toutefois, le fichier mis à jour n'est copié dans le répertoire de sortie que si je sélectionne Reconstruire. Régulier La construction ne fonctionne pas.

De quoi ai-je besoin pour changer de sorte que lorsque j'appuie sur F5, le fichier est copié dans le répertoire de sortie lorsqu'il a été mis à jour?

Répondre

2

Avez-vous essayé de définir l'action de construction sur Aucune?

+0

merci pour la suggestion, mais cela ne semble pas fonctionner. –

+0

J'ai essayé le même scénario dans VS2010 Beta 2 et cela fonctionne. On dirait un bug dans l'édition express. – Ikaso

2

Il semble fonctionner également dans Visual Studio 2008 Team System - doit être édition d'expression spécifique, ne peut donc pas repro ...

OK, je pense d'origine n'a pas été vrai - il est sur XML fichier étant dans la bibliothèque référencée. Peut le reprocher maintenant.

Je pense que la manière la plus naturelle serait d'incorporer le XML en tant que ressource, puis de le lire avec GetManifestResourceStream(). De cette façon, le fichier XML suivrait votre dll comme vous le référencez sans le copier séparément même si vous référencez la DLL directement et non via la référence du projet.

... ou alors vous pouvez utiliser l'événement Pré-construction? (Propriétés du projet - Evénements de construction):

copy $(ProjectDir)test.xml $(SolutiontDir)projectFolder\bin\debug\test.xml 

Je pense qu'il sera toujours courir, même si VS pense pas les fichiers source ont changé. Au moins en plein VS2008 c'est le cas - juste testé.

+0

Cela peut être dû au fait que le dossier "schemas" fait partie de * LogicParser *, alors que Program.cs, la classe à partir de laquelle 'LogicSchema' est instancié, se trouve dans * LogicParser.ConsoleApp *. –

+0

True: J'étais trop paresseux pour faire la bibliothèque de classe séparée lorsque j'ai testé cela. L'a fait maintenant et ça se passe aussi dans la version complète de Visual Studio. Donc pas d'édition Expression spécifique. Donc je suppose que vos options sont d'ajouter l'événement de pré-construction avec $ (SolutionDir) ou alors incorporer le xml comme ressource et le lire avec GetManifestResourceStream(). Je pense que ce dernier est meilleur - si vous créez une DLL, il serait plus agréable si vous pouvez l'utiliser en le référençant sans ajouter d'autres fichiers (xml). – Ope

Questions connexes