Pregunta ¿Cómo obtengo la ruta del ensamblado en el que se encuentra el código?


¿Hay alguna forma de obtener la ruta para el ensamblado en el que reside el código actual? No quiero la ruta del ensamblado que llama, solo la que contiene el código.

Básicamente, mi unidad de prueba necesita leer algunos archivos de prueba xml que se encuentran en relación con el dll. Quiero que la ruta siempre se resuelva correctamente, independientemente de si la dll de prueba se ejecuta desde TestDriven.NET, la interfaz gráfica de usuario de MbUnit u otra cosa.

Editar: La gente parece estar entendiendo mal lo que estoy preguntando.

Mi biblioteca de prueba está ubicada en say

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

y me gustaría obtener este camino:

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

Las tres sugerencias hasta ahora me fallan cuando corro desde el MbUnit Gui:

  • Environment.CurrentDirectory da c: \ Archivos de programa \ MbUnit

  • System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location da C: \ Documentos y Configuraciones \ george \ Local Configuraciones \ Temp \ .... \ DaoTests.dll

  • System.Reflection.Assembly.GetExecutingAssembly().Location da lo mismo que el anterior.


651
2017-09-09 20:12


origen


Respuestas:


He definido la siguiente propiedad ya que la usamos a menudo en pruebas unitarias.

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

los Assembly.Location propiedad a veces te da algunos resultados divertidos cuando utilizas NUnit (donde los ensambles se ejecutan desde una carpeta temporal), así que prefiero usar CodeBase que te da la ruta en formato URI, luego UriBuild.UnescapeDataString elimina el File:// al principio, y GetDirectoryName lo cambia al formato de Windows normal.


892
2017-11-12 13:24



¿Esto ayuda?

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



Es tan simple como esto:

var dir = AppDomain.CurrentDomain.BaseDirectory;

269
2018-05-22 09:14



Lo mismo que la respuesta de John, pero un método de extensión un poco menos detallado.

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

Ahora puedes hacer:

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

o si lo prefiere:

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

63
2018-04-02 14:43



La única solución que funcionó para mí al usar CodeBase y las acciones de UNC Network fue:

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

También funciona con URI normales también.


43
2018-03-16 12:40



Esto debería funcionar, a menos que el montaje sea sombra copiada:

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

31
2017-09-09 20:14



Sospecho que el verdadero problema aquí es que su corredor de prueba está copiando su ensamblaje en una ubicación diferente. No hay forma de que en el tiempo de ejecución se diga de dónde se copió el ensamblaje, pero probablemente se pueda activar un interruptor para indicar al ejecutante de prueba que ejecute el ensamblaje desde donde está y que no lo copie en un directorio oculto.

Tal cambio es probable que sea diferente para cada corredor de prueba, por supuesto.

¿Ha considerado incorporar sus datos XML como recursos dentro de su conjunto de prueba?


11
2017-09-09 21:36



¿Qué tal esto?

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

11
2017-09-09 21:40



AppDomain.CurrentDomain.BaseDirectory

funciona con la GUI de 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



Aquí hay un puerto VB.NET del código de John Sibly. Visual Basic no distingue entre mayúsculas y minúsculas, por lo que un par de sus nombres de variables colisionaron con nombres de tipos.

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