Existe-t-il un moyen d'obtenir le chemin de l'assembly dans lequel réside le code actuel? Je ne veux pas le chemin de l'assembly appelant, juste celui contenant le code.
Fondamentalement, mon test unitaire doit lire certains fichiers de test XML qui se trouvent par rapport à la DLL. Je veux que le chemin soit toujours résolu correctement, que la DLL de test soit exécutée à partir de TestDriven.NET, de l'interface graphique MbUnit ou d'autre chose.
Edit : Les gens semblent mal comprendre ce que je demande.
Ma bibliothèque de tests est située à Say
C: \ projects \ myapplication \ daotests \ bin \ Debug \ daotests.dll
et je voudrais obtenir ce chemin:
C: \ projects \ myapplication \ daotests \ bin \ Debug \
Jusqu'à présent, les trois suggestions me manquent lorsque je cours depuis le MbUnit Gui:
Environment.CurrentDirectory
donne c: \ Program Files \ MbUnitSystem.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location
donne C: \ Documents and Settings \ george \ Local Settings \ Temp \ .... \ DaoTests.dllSystem.Reflection.Assembly.GetExecutingAssembly().Location
donne la même chose que la précédente.
la source
packages
côté du fichier sln. MAIS lorsque vous compilez et distribuez des choses, il n'y a pas de fichier sln ni de répertoire de packages. Pendant la compilation, les éléments nécessaires (mais pas tout) sont copiés dans le répertoire bin. Le mieux est d'utiliser un script de post-construction pour copier le fichier que vous souhaitez.Réponses:
J'ai défini la propriété suivante car nous l'utilisons souvent dans les tests unitaires.
La
Assembly.Location
propriété vous donne parfois des résultats amusants lorsque vous utilisez NUnit (où les assemblys s'exécutent à partir d'un dossier temporaire), donc je préfère utiliserCodeBase
ce qui vous donne le chemin au format URI, puisUriBuild.UnescapeDataString
supprime leFile://
au début et leGetDirectoryName
change au format Windows normal .la source
est-ce que cela aide?
la source
typeof(DaoTests).Assembly
Assembly.GetExecutingAssembly()
. Il "obtient l'assembly qui contient le code en cours d'exécution" (à partir de la description de la méthode). J'utilise ceci dans mon AddIn " EntitiesToDTOs ". Voir AssemblyHelper.cs pour un exemple réel.C'est aussi simple que ça:
la source
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
Identique à la réponse de John, mais une méthode d'extension légèrement moins détaillée.
Vous pouvez maintenant:
ou si vous préférez:
la source
assembly
au lieu deAssembly.GetExecutingAssembly()
?La seule solution qui a fonctionné pour moi lors de l'utilisation des partages CodeBase et UNC Network était:
Il fonctionne également avec les URI normaux.
la source
GetExecutingAssembly()
parGetCallingAssembly()
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
. La première partie est destinée aux applications Web et la seconde aux autres applications.Cela devrait fonctionner, sauf si l'assembly est copié en double :
la source
Et ça:
la source
Je soupçonne que le vrai problème ici est que votre exécuteur de test copie votre assemblage vers un emplacement différent. Il n'y a aucun moyen au moment de l'exécution de dire d'où l'assembly a été copié, mais vous pouvez probablement actionner un commutateur pour dire au testeur d'exécuter l'assembly à partir de son emplacement et de ne pas le copier dans un répertoire caché.
Un tel commutateur est susceptible d'être différent pour chaque testeur, bien sûr.
Avez-vous envisagé d'intégrer vos données XML en tant que ressources dans votre assembly de test?
la source
Assembly.CodeBase
.fonctionne avec MbUnit GUI.
la source
Je crois que cela fonctionnerait pour tout type d'application:
la source
Pour autant que je sache, la plupart des autres réponses ont quelques problèmes.
La façon correcte de le faire pour un assembly basé sur disque (par opposition à basé sur le Web), non GACed est d'utiliser la
CodeBase
propriété de l'assembly en cours d'exécution .Cela renvoie une URL (
file://
). Au lieu de jouer avec la manipulation de chaînes ouUnescapeDataString
, cela peut être converti avec un minimum d'agitation en tirant parti de laLocalPath
propriété deUri
.la source
#
(EscapedCodeBase
fonctionne, mais EscapedCodeBase ne fonctionne pas si le chemin contient par exemple%20
verbatim (qui est une séquence de caractères autorisée dans un chemin Windows))GetExecutingAssembly()
parGetCallingAssembly()
.Que dis-tu de ça ...
Ensuite, piratez simplement ce dont vous n'avez pas besoin
la source
la source
Voici un port VB.NET du code de John Sibly. Visual Basic n'est pas sensible à la casse, donc quelques-uns de ses noms de variables entraient en collision avec des noms de type.
la source
Pendant toutes ces années, personne n'a vraiment mentionné celui-ci. Une astuce que j'ai apprise du génial projet ApprovalTests . L'astuce consiste à utiliser les informations de débogage dans l'assembly pour rechercher le répertoire d'origine.
Cela ne fonctionnera pas en mode RELEASE, ni avec les optimisations activées, ni sur une machine différente de celle sur laquelle elle a été compilée.
Mais cela vous donnera des chemins relatifs à l'emplacement du fichier de code source à partir duquel vous l'appelez
la source
Le répertoire courant où vous existez.
Si vous copiez le fichier .xml avec build, vous devriez le trouver.
ou
la source
Environment.CurrentDirectory
fonctionne si vous utilisez la réflexion dans la classe de tâches MSBuild, où l'assembly en cours d'exécution réside dans GAC et où votre code est ailleurs.J'ai utilisé Assembly.CodeBase au lieu de Location:
Cela fonctionne, mais je ne suis plus sûr qu'il soit correct à 100%. La page à http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx dit:
"Le CodeBase est une URL vers l'endroit où le fichier a été trouvé, tandis que l'emplacement est le chemin où il a été réellement chargé. Par exemple, si l'assembly a été téléchargé à partir d'Internet, son CodeBase peut commencer par" http: // " , mais son emplacement peut commencer par "C: \". Si le fichier a été copié en double, l'emplacement sera le chemin d'accès à la copie du fichier dans le répertoire de cliché instantané. Il est également bon de savoir que le CodeBase n'est pas garanti à définir pour les assemblys dans le GAC. Cependant, l'emplacement sera toujours défini pour les assemblys chargés à partir du disque. "
Vous pouvez utiliser CodeBase au lieu de Location.
la source
Vous pouvez obtenir le chemin du bac par AppDomain.CurrentDomain.RelativeSearchPath
la source
Toutes les réponses proposées fonctionnent lorsque le développeur peut modifier le code pour inclure l'extrait de code requis, mais si vous souhaitez le faire sans modifier le code, vous pouvez utiliser Process Explorer.
Il répertorie toutes les DLL en cours d'exécution sur le système, vous devrez peut-être déterminer l'ID de processus de votre application en cours d'exécution, mais ce n'est généralement pas trop difficile.
J'ai écrit une description complète de la façon de procéder pour une DLL à l'intérieur de II - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -serveur/
la source
dans une application de formulaire Windows, vous pouvez simplement utiliser
Application.StartupPath
mais pour les DLL et les applications console, le code est beaucoup plus difficile à retenir ...
la source
la source
Vous obtiendrez un répertoire incorrect si un chemin contient le symbole «#». J'utilise donc une modification de la réponse de John Sibly qui est la combinaison UriBuilder.Path et UriBuilder.Fragment:
la source
C'est ce que j'ai trouvé. Entre les projets Web, tests unitaires (exécuteur de test de nunit et resharper) ; J'ai trouvé que cela fonctionnait pour moi.
Je cherchais code pour détecter quelle configuration la construction est,
Debug/Release/CustomName
. Hélas, le#if DEBUG
. Donc, si quelqu'un peut améliorer cela !N'hésitez pas à modifier et à améliorer.
Obtention du dossier d'application . Utile pour les racines web, unittests pour obtenir le dossier des fichiers de test.
Obtenir le dossier bin : utile pour exécuter des assemblys à l'aide de la réflexion. Si des fichiers y sont copiés en raison de propriétés de construction.
la source
Cela devrait fonctionner:
J'utilise ceci pour déployer des bibliothèques de fichiers DLL avec un fichier de configuration (c'est pour utiliser log4net à partir du fichier DLL).
la source
fileMap
sert ici?Je trouve ma solution adéquate pour la récupération de l'emplacement.
la source
J'ai eu le même comportement
NUnit
dans le passé. Par défaut,NUnit
copie votre assembly dans le répertoire temporaire. Vous pouvez modifier ce comportement dans lesNUnit
paramètres:Peut
TestDriven.NET
- être que l'MbUnit
interface graphique a les mêmes paramètres.la source
J'utilise ceci pour obtenir le chemin vers le répertoire Bin:
Vous obtenez ce résultat:
la source
Application Web?
la source