Question

Est-il possible 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 emp\ ....\DaoTests.dll

  • System.Reflection.Assembly.GetExecutingAssembly().Location donne le même que le précédent.

Était-ce utile?

La solution

J'ai défini la propriété suivante que nous utilisons souvent dans des tests unitaires.

public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
    }
}

L' 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 utiliser CodeBase qui vous donne le chemin d'accès en format URI, puis UriBuild.UnescapeDataString supprime le File:// au début, et GetDirectoryName les changements à la normale de windows, format.

Autres conseils

Cela vous aide?

//get the full location of the assembly with DaoTests in it
string fullPath = System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location;

//get the folder that's in
string theDirectory = Path.GetDirectoryName( fullPath );

C'est aussi simple que cela:

var dir = AppDomain.CurrentDomain.BaseDirectory;

De même que Jean de réponse, mais un peu moins détaillé de la méthode d'extension.

public static string GetDirectoryPath(this Assembly assembly)
{
    string filePath = new Uri(assembly.CodeBase).LocalPath;
    return Path.GetDirectoryName(filePath);            
}

Maintenant vous pouvez le faire:

var localDir = Assembly.GetExecutingAssembly().GetDirectoryPath();

ou si vous préférez:

var localDir = typeof(DaoTests).Assembly.GetDirectoryPath();

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é:

System.IO.Path.GetDirectoryName(new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath);

Il travaille également avec la normale Uri trop.

Cela devrait fonctionner, à moins que l'assemblée est l'ombre copié:

string path = System.Reflection.Assembly.GetExecutingAssembly().Location

Ce:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

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?

AppDomain.CurrentDomain.BaseDirectory

fonctionne avec MbUnit GUI.

var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var assemblyPath = assembly.GetFiles()[0].Name;
var assemblyDir = System.IO.Path.GetDirectoryName(assemblyPath);

Voici une 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.

Public Shared ReadOnly Property AssemblyDirectory() As String
    Get
        Dim codeBase As String = Assembly.GetExecutingAssembly().CodeBase
        Dim uriBuilder As New UriBuilder(codeBase)
        Dim assemblyPath As String = Uri.UnescapeDataString(uriBuilder.Path)
        Return Path.GetDirectoryName(assemblyPath)
    End Get
End Property

Comment à ce sujet ...

string ThisdllDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

Puis il suffit de pirater ce que vous n'avez pas besoin

Le répertoire courant où vous existez.

Environment.CurrentDirectory;  // This is the current directory of your application

Si vous copiez la .fichier xml de construire avec vous devriez le trouver.

ou

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetAssembly(typeof(SomeObject));

// The location of the Assembly
assembly.Location;

J'ai été en utilisant de l'Assemblée.Base de code au lieu de l'Emplacement:

Assembly a;
a = Assembly.GetAssembly(typeof(DaoTests));
string s = a.CodeBase.ToUpper(); // file:///c:/path/name.dll
Assert.AreEqual(true, s.StartsWith("FILE://"), "CodeBase is " + s);
s = s.Substring(7, s.LastIndexOf('/') - 7); // 7 = "file://"
while (s.StartsWith("/")) {
    s = s.Substring(1, s.Length - 1);
}
s = s.Replace("/", "\\");

Elle fonctionne, mais je ne suis plus sûr qu'il est correct à 100%.La page d' 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 de l'Emplacement.

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 de la propriété.

Cette fonction retourne une URL (file://).Au lieu de déconner avec la manipulation de la chaîne ou UnescapeDataString, cela peut être converti avec un minimum de tracas en tirant parti de la LocalPath propriété de Uri.

var codeBaseUrl = Assembly.GetExecutingAssembly().CodeBase;
var filePathToCodeBase = new Uri(codeBaseUrl).LocalPath;
var directoryPath = Path.GetDirectoryName(filePathToCodeBase);

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 une machine différente de celle qu'elle a été compilé.

Mais cela vous obtiendrez des chemins qui sont par rapport à l'emplacement du fichier de code source, vous appeler à partir d'

public static class PathUtilities
{
    public static string GetAdjacentFile(string relativePath)
    {
        return GetDirectoryForCaller(1) + relativePath;
    }
    public static string GetDirectoryForCaller()
    {
        return GetDirectoryForCaller(1);
    }


    public static string GetDirectoryForCaller(int callerStackDepth)
    {
        var stackFrame = new StackTrace(true).GetFrame(callerStackDepth + 1);
        return GetDirectoryForStackFrame(stackFrame);
    }

    public static string GetDirectoryForStackFrame(StackFrame stackFrame)
    {
        return new FileInfo(stackFrame.GetFileName()).Directory.FullName + Path.DirectorySeparatorChar;
    }
}

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...

string slash = Path.DirectorySeparatorChar.ToString();
string root = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

root += slash;
string settingsIni = root + "settings.ini"
string path = Path.GetDirectoryName(typeof(DaoTests).Module.FullyQualifiedName);

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:

public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        //modification of the John Sibly answer    
        string path = Uri.UnescapeDataString(uri.Path.Replace("/", "\\") + 
          uri.Fragment.Replace("/", "\\"));
        return Path.GetDirectoryName(path);
     }
}

C'est ce que je suis venu avec. Entre les projets web, tests unitaires (nunit et resharper test runner);J'ai trouvé 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, l' #if DEBUG. Donc si quelqu'un peut l'améliorer!

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.

public static string AppPath
{
    get
    {
        DirectoryInfo appPath = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);

        while (appPath.FullName.Contains(@"\bin\", StringComparison.CurrentCultureIgnoreCase)
                || appPath.FullName.EndsWith(@"\bin", StringComparison.CurrentCultureIgnoreCase))
        {
            appPath = appPath.Parent;
        }
        return appPath.FullName;
    }
}

Arriver dossier 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.

public static string BinPath
{
    get
    {
        string binPath = AppDomain.CurrentDomain.BaseDirectory;

        if (!binPath.Contains(@"\bin\", StringComparison.CurrentCultureIgnoreCase)
            && !binPath.EndsWith(@"\bin", StringComparison.CurrentCultureIgnoreCase))
        {
            binPath = Path.Combine(binPath, "bin");
            //-- Please improve this if there is a better way
            //-- Also note that apps like webapps do not have a debug or release folder. So we would just return bin.
#if DEBUG
            if (Directory.Exists(Path.Combine(binPath, "Debug"))) 
                        binPath = Path.Combine(binPath, "Debug");
#else
            if (Directory.Exists(Path.Combine(binPath, "Release"))) 
                        binPath = Path.Combine(binPath, "Release");
#endif
        }
            return binPath;
    }
}

Cela devrait fonctionner:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
Assembly asm = Assembly.GetCallingAssembly();
String path = Path.GetDirectoryName(new Uri(asm.EscapedCodeBase).LocalPath);

string strLog4NetConfigPath = System.IO.Path.Combine(path, "log4net.config");

Je me sers de 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).

J'ai trouver ma solution adéquate pour la recherche de l'emplacement.

var executingAssembly = new FileInfo((Assembly.GetExecutingAssembly().Location)).Directory.FullName;

J'ai eu le même comportement dans l' NUnit dans le passé.Par défaut NUnit des copies de votre assemblée dans le répertoire temp.Vous pouvez modifier ce comportement dans l' NUnit paramètres:

enter image description here

Peut-être TestDriven.NET et MbUnit GUI ont les mêmes paramètres.

Je l'utilise pour obtenir le chemin d'accès vers le Répertoire Bin:

var i = Environment.CurrentDirectory.LastIndexOf(@"\");
var path = Environment.CurrentDirectory.Substring(0,i); 

Vous obtenez ce résultat:

"c:\users icooley\documents\visual studio 2010\Projects\Windows_Test_Project\Windows_Test_Project\bin"

Application Web?

Server.MapPath("~/MyDir/MyFile.ext")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top