Question Comment obtenir le chemin de l'assemblage dans lequel se trouve le code?


Est-il possible d'obtenir le chemin d'accès à 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 d'unité doit lire certains fichiers de test XML qui sont situés par rapport à la DLL. Je veux que le chemin soit toujours résolu correctement, que la DLL de test soit exécutée depuis TestDriven.NET, l'interface graphique MbUnit ou autre chose.

modifier: Les gens semblent mal comprendre ce que je demande.

Ma bibliothèque de test est située à dire

C: \ projects \ monapplication \ daotests \ bin \ Debug \ daotests.dll

et je voudrais obtenir ce chemin:

C: \ projects \ monapplication \ daotests \ bin \ Debug \

Les trois suggestions jusqu'à présent échouent quand je cours du MbUnit Gui:

  • Environment.CurrentDirectory donne c: \ Program Files \ MbUnit

  • System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location donne C: \ Documents et Paramètres \ george \ Local Paramètres \ Temp \ .... \ DaoTests.dll

  • System.Reflection.Assembly.GetExecutingAssembly().Location donne la même chose que la précédente.


651
2017-09-09 20:12


origine


Réponses:


J'ai défini la propriété suivante car nous l'utilisons souvent dans les 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);
    }
}

le Assembly.Location la propriété vous donne parfois des résultats amusants lors de l'utilisation de NUnit (où les assemblys s'exécutent à partir d'un dossier temporaire), donc je préfère utiliser CodeBase qui vous donne le chemin au format URI, puis UriBuild.UnescapeDataString supprime le File:// au début, et GetDirectoryName le change au format normal de Windows.


892
2017-11-12 13:24



est-ce que cela 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 );

283
2017-09-09 21:26



C'est aussi simple que ça:

var dir = AppDomain.CurrentDomain.BaseDirectory;

269
2018-05-22 09:14



Même chose que la réponse de John, mais une méthode d'extension légèrement moins verbeuse.

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

Maintenant vous pouvez faire:

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

ou si vous préférez:

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

63
2018-04-02 14:43



La seule solution qui a fonctionné pour moi lors de l'utilisation des partages CodeBase et UNC Network était:

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

Cela fonctionne également avec les URI normales.


43
2018-03-16 12:40



Cela devrait fonctionner, sauf si l'assemblage est ombre copiée:

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

31
2017-09-09 20:14



Je soupçonne que le vrai problème ici est que votre coureur d'essai copie votre assemblée à un endroit différent. Au moment de l'exécution, il est impossible de dire d'où l'assemblage a été copié, mais vous pouvez probablement basculer un commutateur pour indiquer au coureur de test d'exécuter l'assembly à partir de l'emplacement et de ne pas le copier dans un répertoire d'ombre.

Un tel changement est susceptible d'être différent pour chaque coureur d'essai, bien sûr.

Avez-vous envisagé d'intégrer vos données XML en tant que ressources dans votre assemblage de test?


11
2017-09-09 21:36



Et ça:

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

11
2017-09-09 21:40



AppDomain.CurrentDomain.BaseDirectory

fonctionne avec l'interface graphique MbUnit.


9
2018-06-16 08:07



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

7
2017-09-09 21:32



Voici un port VB.NET du code de John Sibly. Visual Basic n'est pas sensible à la casse, donc un couple de ses noms de variables étaient en collision avec les noms de type.

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

7
2018-05-19 18:58