Comment puis-je convertir Assemblée.La base de code dans un chemin du système de fichiers en C#?
J'ai un projet qui stocke les modèles dans un \Templates
dossier à côté de la Dll et EXE.
Je veux déterminer ce chemin d'accès au fichier lors de l'exécution, mais en utilisant une technique qui fonctionne à l'intérieur d'une unité de test ainsi que dans la production (et je ne veux pas désactiver l'ombre-la copie de NUnit!)
Assembly.Location
n'est pas bon parce qu'il renvoie l'ombre-copié de l'assemblée chemin d'accès lors de l'exécution en vertu de NUnit.
Environment.CommandLine
est également limité car dans NUnit et al, il renvoie le chemin d'accès NUnit, pas à mon projet.
Assembly.CodeBase
semble prometteur, mais c'est un chemin d'accès UNC:
file:///D:/projects/MyApp/MyApp/bin/debug/MyApp.exe
Maintenant, je pourrait dans un local chemin du système de fichiers à l'aide de la manipulation de la chaîne, mais je suspecte qu'il y a une manière plus propre de le faire enterré dans le .NET framework quelque part. Quelqu'un connait un moyen recommandé de le faire?
(Lancer une exception si le chemin d'accès UNC n'est pas un file:///
URL est absolument parfait dans ce contexte)
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser le Système.Uri.LocalPath:
Donc, si vous souhaitez l'emplacement d'origine de l'exécution actuelle de l'assemblée:
Uri.LocalPath
- nous avons eu un bug ont été nous avons utiliséUri.AbsolutePath
, qui semble fonctionner jusqu'à ce que vous avez un espace dans le nom du chemin d'accès!%20
par exemple, mêmeLocalPath
l'habitude de travailler. (Ce qui pourrait être acceptable .... les chemins locaux contenant une%xx
d'évasion sont plutôt rares. Voir ce commentaire sur autre question: stackoverflow.com/questions/52797/...EscapedCodeBase
, cette réponse peut-être incorrect pour certains cas d'utilisation. Voir @MartinBa la réponse ci-dessous pour expliquer pourquoi et l'utilisation de sa solution, si vous la valeur de la justesse de plus, la facilité de développement.new Uri(assembly.EscapedCodeBase).LocalPath
, mais même cela peut échouer en raisonEscapedCodeBase
mal s'échappe le cheminSpace( )(h#)(p%20){[a&],t@,p%,+}
commeSpace(%20)(h%23)(p%20)%7B%5Ba%26%5D,t@,p%,+%7D.,
qui unescapes àSpace( )(h#)(p ){[a&],t@,p%,+}.,
(le%20
dans le chemin d'accès a été changé pour un espace).Ne remarque que c'est quelque chose se rapprochant d'un uri du fichier, pas un Chemin d'accès UNC.
Vous résoudre ce problème en faisant la manipulation de la chaîne à la main. Au sérieux.
Essayé toutes les autres méthodes que vous pouvez trouver sur DONC, avec le répertoire suivant (verbatim):
C'est valable, si quelque chose d'inhabituel path de Windows. (Certaines personnes sera l'un ou l'autre de ces caractères il y a des chemins, et que vous voulez vous la méthode de travail pour tous de ceux qui, à droite?),
La disposition de la base de code (nous ne voulons pas
Localisation
, à droite?) les propriétés sont ensuite (sur mon Win7 .NET 4):Vous aurez remarque:
CodeBase
n'est pas échappé à tous, c'est juste la régulière chemin d'accès local avec le préfixefile:///
et les barres obliques inverses remplacé. En tant que tel, il ne pas travail pour nourrir ceSystem.Uri
.EscapedCodeBase
n'est pas complètement échappé (je ne pas savoir si c'est un bug ou si c'est une lacune de la Schéma d'URI):) se traduit par
%20
%20
séquence aussi se traduit par%20
! (pour cent%
n'est pas échappé à tous)Pour les fichiers locaux (Et c'est vraiment tout ce que j'avais de soins pour le
CodeBase
de trucs, parce que si le fichier n'est pas local, vous voudrez probablement utiliser.Location
de toute façon, les ouvrages suivants, pour moi (notez que ce n'est pas la plus belle, soit:Je suis sûr que l'on peut venir avec les meilleures solutions, probablement, on pourrait même venir avec une solution qui répond à une URL correcte fr/décodage de la
CodeBase
bien si c'est un chemin d'accès local, mais étant donné qu'on peut juste enlever lesfile:///
et être fait avec elle, je dirais que cette solution représente assez bon, si certainement vraiment moche.\\server\...
chemin est codé avec seulement deux barres obliques, au lieu de la 3 quand avoir un lecteur local?\\?\UNC\server\share
chemins sont codés?Cela devrait fonctionner:
Je suis l'utiliser pour être en mesure de se connecter à partir de dans les bibliothèques dll à l'aide d'un autonome log4net.fichier de configuration.
La solution, y compris des voies complexes:
et tests:
GetPathFromUri
parPath.GetFullPath
.Depuis que vous avez marqués cette question NUnit, vous pouvez également utiliser
AssemblyHelper.GetDirectoryName
pour obtenir le répertoire d'origine de l'assembly en cours d'exécution: