Comment puis-je obtenir le chemin d'accès de l'assemblée le code est-il?
Est-il un moyen d'obtenir le chemin d'accès pour l'assemblée, dans laquelle le code actuel réside? Je ne veux pas le chemin de la convocation de l'assemblée, juste l'un contenant le code.
Fondamentalement, mon test unitaire doit lire du xml fichiers de test qui sont situés par rapport à la dll. Je veux que le chemin d'accès à toujours résoudre correctement, peu importe si le test dll est exécuté à partir d'TestDriven.NET le MbUnit GUI ou quelque chose d'autre.
Modifier: les Gens semblent être de l'incompréhension de ce que je vous demande.
Ma bibliothèque de test est situé à dire
C:\projects\myapplication\daotests\bin\Debug\daotests.dll
et je voudrais le mettre sur ce chemin:
C:\projects\myapplication\daotests\bin\Debug\
Les trois suggestions jusqu'à présent à me manquer quand je le lance à partir de la MbUnit Gui:
-
Environment.CurrentDirectory
donne c:\Program Files\MbUnit -
System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location
donne C:\Documents et
Settings\george\Local
Settings\Temp\ ....\DaoTests.dll -
System.Reflection.Assembly.GetExecutingAssembly().Location
donne le même que le précédent.
- C'est votre solution: var dir = domaine d'application.CurrentDomain.BaseDirectory;
- Cela devrait être la solution retenue. Domaine d'application.CurrentDomain.BaseDirectory est la bonne approche.
- Voir: finding-my-main-executables-path-using-assembly-vs-appdomain
- Je suis venu ici à la recherche d'une solution pour un package nuget pour lire un fichier JSON à partir de son paquet de répertoire. Il semble que quand un package nuget est exécutée, le "domaine d'application.CurrentDomain.BaseDirectory" les points à l'exécution de projets de répertoire, et non pas le package nuget répertoire. Aucune de ces semblent cibler le package nuget répertoire correctement.
- non, ce ne serait pas parce que ce n'est pas ce que cette question était d'environ (en fait, quand il a été demandé, nuget n'existait pas) - n'hésitez pas à commencer une nouvelle question et une table de ping-moi là, mais je peux vous dire dès maintenant que son impossible dans la plupart des cas. Pour la plupart des projets de la nuget répertoire est
packages
à côté de la sln fichier. MAIS quand vous rassembler et de diffuser des choses il n'existe pas de fichier sln et pas de répertoire packages. Lors de la compilation, les choses qui sont nécessaires (mais pas tout) est copié dans le répertoire bin. Votre meilleur pari est d'utiliser un postbuild script pour copier le fichier que vous voulez. - Pour ceux qui lisent ces commentaires croire
AppDomain.CurrentDomain.BaseDirectory
est la bonne solution, reportez-vous à ce commentaire qui propose une meilleure solution.
Vous devez vous connecter pour publier un commentaire.
J'ai défini la propriété suivante que nous utilisons souvent dans des tests unitaires.
La
Assembly.Location
bien, parfois, vous donne de drôles de résultats lors de l'utilisation de NUnit (où assemblées exécuter à partir d'un dossier temporaire), donc je préfère utiliserCodeBase
qui vous donne le chemin d'accès en format URI, puisUriBuild.UnescapeDataString
supprime laFile://
au début, etGetDirectoryName
changements à la normale de windows, format.CodeBase
est un gâchis. Voici mon point de vue sur ça: stackoverflow.com/a/28319367/321013Cela vous aide?
typeof(DaoTests).Assembly
public static string GetAssemblyDirectory<T>(){return System.IO.Path.GetDirectoryName(typeof(T).Assembly.Location);}
string
et l'entrée toujoursType
? Vous pourriez faire:public static string GetAssemblyDirectory(this Type input){return System.IO.Path.GetDirectoryName(input.Assembly.Location);}
de cette façon, vous n'avez pas besoin de connaître le type explicitement:unknown.GetType().GetAssemblyDirectory();
Assembly.GetExecutingAssembly()
. "obtient l'assembly qui contient le code qui est actuellement en cours d'exécution" (à partir de la description de la méthode). - Je l'utiliser dans mon AddIn "EntitiesToDTOs". Voir AssemblyHelper.cs pour l'exemple réel.C'est aussi simple que cela:
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
Même que Jean de réponse, mais un peu moins détaillé de la méthode d'extension.
Maintenant vous pouvez le faire:
ou si vous préférez:
assembly
au lieu deAssembly.GetExecutingAssembly()
?La seule solution qui a fonctionné pour moi lors de l'utilisation de la base de Code et de Réseau UNC actions a été:
Il travaille également avec la normale Uri trop.
GetExecutingAssembly()
parGetCallingAssembly()
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
. La première partie est pour les applications web, et la seconde pour les autres applications.Cela devrait fonctionner, à moins que l'assemblée est ombre copié:
Quoi à ce sujet:
Je soupçonne que le vrai problème ici est que votre test runner est la copie de votre assemblée à un autre emplacement. Il n'y a aucun moyen au moment de l'exécution de dire où l'assemblée a été copié à partir, mais vous pouvez probablement appuyer sur un bouton pour dire le lanceur de test pour exécuter l'assemblée de l'endroit où il est et de ne pas les copier vers un répertoire de l'ombre.
Un tel commutateur est susceptible d'être différent pour chaque test runner, bien sûr.
Avez-vous envisagé l'intégration de vos données XML en tant que ressources à l'intérieur de votre test de montage?
Assembly.CodeBase
.fonctionne avec MbUnit GUI.
Aussi loin que je peux dire, la plupart des autres réponses ont quelques problèmes.
La manière correcte de le faire pour un basé sur le disque (par opposition à l'basé sur le web), non-GACed assemblée est à utiliser en cours d'exécution de l'assemblée
CodeBase
propriété.Cela renvoie une URL (
file://
). Au lieu de déconner avec le la manipulation de la chaîne ouUnescapeDataString
, cela peut être converti avec un minimum de tracas en tirant parti de laLocalPath
propriété deUri
.#
(EscapedCodeBase
fonctionne, mais EscapedCodeBase ne fonctionne pas si le chemin d'accès contient par exemple%20
verbatim (qui est un permis à séquence de caractères dans un chemin d'accès Windows)GetExecutingAssembly()
parGetCallingAssembly()
.Ici est un VB.NET port de John Sibly du code. Visual Basic n'est pas sensible à la casse, un couple de ses noms de variables ont été en collision avec les noms de type de.
Comment à ce sujet ...
Puis il suffit de pirater ce que vous n'avez pas besoin
Dans toutes ces années, personne n'a réellement mentionné celui-ci. Un truc que j'ai appris à partir de l'impressionnant ApprovalTests projet. Le truc, c'est que vous utilisez les informations de débogage dans l'assemblée pour trouver le répertoire d'origine.
Cela ne fonctionnera pas en mode RELEASE, ni avec les optimisations activées, ni sur un ordinateur différent de celui sur lequel il a été compilé.
Mais cela vous obtiendrez des chemins qui sont par rapport à l'emplacement du fichier de code source, vous appelez ça de
Le répertoire courant où vous existez.
Si vous copiez la .fichier xml de construire avec vous devriez le trouver.
ou
Environment.CurrentDirectory
fonctionne si vous êtes l'aide de la réflexion dans la tâche MSBuild classe, où l'assembly en cours d'exécution réside dans le GAC et votre code est quelque part d'autre.J'ai été en utilisant de l'Assemblée.Base de code au lieu de la location:
Elle fonctionne, mais je ne suis plus sûr qu'il est correct à 100%. La page à http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx dit:
"Le Code de base d'une URL à l'endroit où le fichier a été trouvé, alors que l'Emplacement est le chemin où il avait été chargé. Par exemple, si l'assemblée a été téléchargé à partir d'internet, de ses CodeBase peut commencer par "http://", mais son Emplacement peut commencer par "C:\". Si le fichier a été l'ombre-copié, l'Emplacement de la voie à la copie du fichier dans le cliché dir.
Il est également bon de savoir que le Code n'est pas garanti à définir pour les assemblées dans le GAC. Emplacement sera toujours ensemble pour les assemblées chargé à partir du disque, cependant."
Vous peut souhaitez utiliser la base de Code au lieu d'Emplacement.
Je crois que ce serait travailler pour tout type d'application:
Vous pouvez obtenir le bac chemin par
Domaine d'application.CurrentDomain.RelativeSearchPath
Toutes les propositions de réponses de travail lorsque le développeur peut modifier le code pour inclure le nécessaire extrait de code, mais si vous vouliez le faire, sans modification du code que vous pourriez utiliser Process Explorer.
Il fournira la liste de tous les exécuter dll sur le système, vous devez déterminer l'id de processus de votre application en cours d'exécution, mais qui n'est généralement pas trop difficile.
J'ai écrit une description complète de la façon dont ce faire, pour une dll à l'intérieur II - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web-server/
dans un formulaire windows app, vous pouvez simplement utiliser
Application.StartupPath
mais pour les Dll et console apps le code est beaucoup plus difficile à retenir...
Vous obtiendrez de mauvaises répertoire si un chemin d'accès contient le '#' symbole.
J'utilise donc une modification de la John Sibly réponse est la combinaison UriBuilder.Chemin d'accès et UriBuilder.Fragment:
C'est ce que je suis venu avec. Entre les projets web, tests unitaires (nunit et resharper test runner); j'ai trouvé que cela a fonctionné pour moi.
J'ai été à la recherche pour le code de détecter la configuration de la construction est en,
Debug/Release/CustomName
. Hélas, le#if DEBUG
. Donc si quelqu'un peut améliorer que!N'hésitez pas à modifier et améliorer.
Arriver dossier app. Utile pour le web racines, unittests pour obtenir le dossier de fichiers de test.
Arriver bin: Utile pour l'exécution des assemblages à l'aide de la réflexion. Si les fichiers sont copiés en raison de construire des propriétés.
Cela devrait fonctionner:
Je suis en utilisant ce pour déployer le fichier DLL bibliothèques avec un fichier de configuration (c'est d'utiliser log4net de l'intérieur le fichier DLL).
fileMap
utilisé pour ici?J'ai trouver ma solution adéquate pour la recherche de l'emplacement.
J'ai eu le même comportement dans le
NUnit
dans le passé. Par défautNUnit
des copies de votre assemblée dans le répertoire temp. Vous pouvez modifier ce comportement dans l'NUnit
paramètres:Peut-être
TestDriven.NET
etMbUnit
GUI ont les mêmes paramètres.Je l'utilise pour obtenir le chemin d'accès vers le Répertoire Bin:
Vous obtenez ce résultat:
Application Web?