Cum a face I a lua calea de asamblare codul este în?

Există o modalitate de a obține calea pentru adunarea în care actualul cod locuiește? Nu vreau calea sunat adunarea, doar unul care conține codul.

Practic, unitatea mea de test trebuie să citească unele xml fișierele de test, care sunt situate relativ dll. Vreau calea de a rezolva întotdeauna corect, indiferent dacă testarea dll este condus de TestDriven.NET, la MbUnit GUI sau altceva.

Edit: Oamenii par să nu înțelegi ce-am'm a întrebat.

Testul meu de bibliotecă este situat într-o spun

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

și aș dori pentru a obține această cale:

C:\projects\myapplication\daotests\bin\Debug\

Trei sugestii, asa ca acum nu-mi atunci când am alerga de la MbUnit Gui:

  • Mediu.CurrentDirectory` dă c:\Program Files\MbUnit

  • Sistem.Reflecție.De asamblare.GetAssembly(typeof(DaoTests)).Locație dă C:\Documents și Settings\george\Local Settings\Temp\ ....\DaoTests.dll

  • Sistem.Reflecție.De asamblare.GetExecutingAssembly().Locație dă aceeași ca și cea anterioară.

Comentarii la întrebare (6)
Soluția

Am'am definit următoarele proprietăți ca vom folosi acest lucru de multe ori în unitate de testare.

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);
    }
}

La Adunare.Location proprietatea uneori dă unele rezultate atunci când se utilizează NUnit (în cazul în care adunările alerga dintr-un folder temporar), așa că prefer să folosesc CodeBasecare dă drumul în format URI, apoiUriBuild.UnescapeDataStringeliminăFile:// la început, și GetDirectoryName modificări la windows normal format.

Comentarii (17)

Ajută asta?

//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 );
Comentarii (12)

L's la fel de simplu ca acest lucru:

var dir = AppDomain.CurrentDomain.BaseDirectory;
Comentarii (9)

Fel ca's a răspuns, dar un pic mai puțin detaliat metoda de extindere.

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

Acum puteți face:

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

sau, dacă preferați:

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

Singura soluție care a lucrat pentru mine atunci când se utilizează CodeBase și UNC acțiuni de Rețea a fost:

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

De asemenea, funcționează cu normal Uri prea.

Comentarii (6)

Acest lucru ar trebui să funcționeze, cu excepția cazului în care adunarea este shadow copied:

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

Ce zici de asta:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
Comentarii (0)
AppDomain.CurrentDomain.BaseDirectory

funcționează cu MbUnit GUI.

Comentarii (2)

Bănuiesc că adevărata problemă aici este că testul runner este copierea de asamblare într-o locație diferită. Nu's nici un fel la runtime pentru a spune unde ansamblul a fost copiat de la, dar, probabil, puteți apăsa un buton pentru a spune testul alergător pentru a rula ansamblul de unde este, și nu pentru a le copia la un shadow director.

Un astfel de comutator este probabil să fie diferite pentru fiecare test runner, desigur.

Te-ai gândit încorporarea de date XML ca resurse în interiorul tău test de asamblare?

Comentarii (1)

În măsura în care eu pot spune, de cele mai multe alte răspunsuri au câteva probleme.

Modul corect de a face acest lucru pentru un bazat pe disc (spre deosebire de web-based), non-GACed de asamblare este de a utiliza de executare în prezent de asamblare's `CodeBase de proprietate.

Acesta returnează o adresă URL (file://). În loc de în jur de joc cu șir de manipulare sau UnescapeDataString, acest lucru poate fi convertit cu un minim de tam-tam prin folosirea LocalPath proprietatea Uri.

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

Aici este o VB.NET portul de John Sibly's cod. Visual Basic nu este case sensitive, deci, câteva nume de variabile au fost coliziunea cu nume de tip.

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
Comentarii (1)
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var assemblyPath = assembly.GetFiles()[0].Name;
var assemblyDir = System.IO.Path.GetDirectoryName(assemblyPath);
Comentarii (0)

Ce zici de asta ...

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

Apoi hack doar pe ce nu ai nevoie

Comentarii (0)

În toți acești ani, nimeni nu a pomenit de asta. Un truc învățat de minunat ApprovalTests project. Trucul este să utilizați informații de depanare în ansamblul pentru a găsi directorul original.

Acest lucru nu va funcționa în modul de LANSARE, nici cu optimizări activat, nici pe o mașină diferită de cea pentru care au fost elaborate pe.

Dar acest lucru te va căi că sunt relativă la locația de fișier de cod sursă suni la

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;
    }
}
Comentarii (0)

Directorul curent în cazul în care exiști.

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

Dacă copiați .fișier xml cu construiască ar trebui să-l găsească.

sau

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

// The location of the Assembly
assembly.Location;
Comentarii (3)

Am'am fost folosind de Asamblare.CodeBase în loc de Amplasare:

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("/", "\\");

L's a fost de lucru, dar am'm nu mai este sigur că acesta este de 100% corecte. Pagina de la http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx spune:

"CodeBase este un URL la locul în care fișierul a fost găsit, în timp ce Locația este calea unde a fost încărcată. De exemplu, dacă adunarea a fost descărcat de pe internet, sa CodeBase poate începe cu "http://", dar Locația sa poate începe cu "C:\". Dacă fișierul a fost umbra-copiate, Locația ar fi calea de a copia fișierul în shadow copy dir. Este, de asemenea, bine să știți că CodeBase nu este garantat de a fi setat pentru ansambluri în GAC. Locația va fi întotdeauna stabilită pentru adunările încărcate de pe disc, cu toate acestea."

Ai may doriți să utilizați CodeBase în loc de Locație.

Comentarii (2)

Cred că acest lucru va lucra pentru orice tip de aplicație:

AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
Comentarii (1)

Puteți obține bin calea de AppDomain.CurrentDomain.RelativeSearchPath

Comentarii (0)

într-un formular de windows app, puteți folosi pur și simplu de Aplicare.StartupPath`

dar pentru Dll-uri și console de aplicații codul este mult mai greu să-și amintească...

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

root += slash;
string settingsIni = root + "settings.ini"
Comentarii (0)

Toate răspunsurile propuse de muncă în cazul în care dezvoltatorul poate schimba codul de a include necesară fragment, dar dacă ai vrut să faci acest lucru fără a modifica orice cod ai putea folosi Process Explorer.

Aceasta va lista toate executare dll-uri pe sistem, ar putea fi necesar pentru a determina procesul de id-ul de aplicație care rulează, dar care este, de obicei, nu prea dificil.

Am'am scris o descriere completă a cum face acest lucru pentru un dll în interiorul II - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web-server/

Comentarii (2)