2016-04-30 1 views
0

J'ai besoin de savoir s'il existe une sorte de directive de préprocesseur, ou peut-être juste une astuce qui me permet d'intégrer le dossier de solution dans lequel une application a été compilée dans l'application elle-même.Obtenir le ProjectPath ou le SolutionPath dans le code

Nous avons un système qui a besoin de vérifier les fichiers sur la machine locale et s'ils ne sont pas présents, va les chercher et les récupérer à partir d'un serveur distant ou d'un service cloud. Cela doit être résumé pour des raisons de portabilité. Nous avons des tests unitaires qui vérifient que la logique de récupération et de stockage à distance fonctionne correctement, mais avant de passer aux serveurs, je dois m'assurer que les gens testent localement de bout en bout, donc je veux avoir un fournisseur de fichiers distant factice cela vérifie simplement dans un dossier différent sur la machine locale. Je ne veux pas supposer un chemin particulier (comme C: \ dummy_files) et je ne peux pas non plus supposer que les fichiers seront relatifs au chemin d'exécution réel pour l'assembly compilé (donc quelque chose comme Directory.GetCurrentDirectory() ne va pas travail).

Si je sais d'où l'application exécutée a été compilée, alors les fichiers doivent être relatifs au répertoire de la solution avec le code source. Évidemment, je vais mettre des directives de préprocesseur pour autoriser seulement ce code à s'exécuter dans le débogage.

+0

Utilisez NMake: https://msdn.microsoft.com/en-us/library/dd9y37ha.aspx – jdweng

Répondre

1

Considérez un script de pré-construction (Projet -> Propriétés -> Générer des événements -> Ligne de commande d'un événement de pré-construction) qui écrit $(ProjectPath) dans un fichier texte. Vous pouvez ensuite inclure ce fichier texte en tant que ressource incorporée et en faire la lecture à l'aide des API Reflection.

+0

C'était assez proche de ce que j'avais en tête. Fonctionne très bien, juste souhaiter qu'il y avait un moyen plus direct d'injecter des paramètres de construction. – drz

0

si vous voulez juste besoin d'un chemin d'exécution, vous pouvez utiliser:

Environment.CurrentDirectory 
+0

J'ai spécifiquement dit que je voulais éviter ce genre de méthode appel – drz

+0

Oups! donc je ne comprends pas ce que tu veux vraiment. comment les fichiers Embedded et le chemin virtuel, Voulez-vous quelque chose comme ça? –

0

S'il vous plaît essayer cette

string wanted_path = Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory())); 
0

essayer avec ci-dessous

Server.MapPath 

ou

Request.MapPath 
+0

J'ai spécifiquement dit que je voulais éviter ce genre de fonction qui dépend du chemin de l'exécutable, plutôt que d'où les fichiers source sont situés. – drz