¿Cómo obtener la ubicación de la DLL que se está ejecutando actualmente?

93

Tengo un archivo de configuración que necesito cargar como parte de la ejecución de un dll que estoy escribiendo.

El problema que tengo es que el lugar donde coloco el archivo dll y config no es la "ubicación actual" cuando la aplicación se está ejecutando.

Por ejemplo, pongo el archivo dll y xml aquí:

D: \ Archivos de programa \ Microsoft Team Foundation Server 2010 \ Application Tier \ Web Services \ bin \ Plugins

Pero si trato de hacer referencia al archivo xml (en mi dll) de esta manera:

XDocument doc = XDocument.Load(@".\AggregatorItems.xml")

luego . \ AggregatorItems.xml se traduce en:

C: \ windows \ system32 \ inetsrv \ AggregatorItems.xml

Entonces, necesito encontrar una manera (espero) de saber dónde se encuentra la dll que se está ejecutando actualmente. Básicamente estoy buscando esto:

XDocument doc = XDocument.Load(CoolDLLClass.CurrentDirectory+@"\AggregatorItems.xml")
Vaccano
fuente

Respuestas:

139

Estás buscando System.Reflection.Assembly.GetExecutingAssembly()

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string xmlFileName = Path.Combine(assemblyFolder,"AggregatorItems.xml");

Nota:

La .Locationpropiedad devuelve la ubicación del archivo DLL que se está ejecutando actualmente.

En algunas condiciones, la DLL se copia antes de su ejecución y la .Locationpropiedad devolverá la ruta de la copia. Si desea la ruta de la DLL original, use la Assembly.GetExecutingAssembly().CodeBasepropiedad en su lugar.

.CodeBasecontiene un prefijo ( file:\), que es posible que deba eliminar.

Vidrio roto
fuente
8
¡Pobre de mí! Eso regresaC:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
Vaccano
23
¡Ah! ¡Pero lo Assembly.GetExecutingAssembly().CodeBasetiene!
Vaccano
2
CodeBase me dio el archivo: \\ c: \ myassemblypath, que es extraño
Matt
10
@Matt usa el nuevo Uri (Assembly.GetExecutingAssembly (). CodeBase) .LocalPath para obtener un nombre real
Larry
2
string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
Martin Connell
36

La reflexión es tu amiga, como se ha señalado. Pero necesitas usar el método correcto;

Assembly.GetEntryAssembly()     //gives you the entrypoint assembly for the process.
Assembly.GetCallingAssembly()   // gives you the assembly from which the current method was called.
Assembly.GetExecutingAssembly() // gives you the assembly in which the currently executing code is defined
Assembly.GetAssembly( Type t )  // gives you the assembly in which the specified type is defined.
Nicolás Carey
fuente
16

En mi caso (tratando con mis ensamblajes cargados [como archivo] en Outlook):

typeof(OneOfMyTypes).Assembly.CodeBase

Tenga en cuenta el uso de CodeBase(no Location) en el Assembly. Otros han señalado métodos alternativos para ubicar el conjunto.


fuente
5
System.Reflection.Assembly.GetExecutingAssembly().Location
Hawxby
fuente
1

Si está trabajando con una aplicación asp.net y desea ubicar ensamblados cuando usa el depurador, generalmente se colocan en algún directorio temporal. Escribí este método para ayudar con ese escenario.

private string[] GetAssembly(string[] assemblyNames)
{
    string [] locations = new string[assemblyNames.Length];


    for (int loop = 0; loop <= assemblyNames.Length - 1; loop++)       
    {
         locations[loop] = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic && a.ManifestModule.Name == assemblyNames[loop]).Select(a => a.Location).FirstOrDefault();
    }
    return locations;
}

Para obtener más detalles, consulte esta publicación de blog http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-assembly-in-net/

Si no puede cambiar el código fuente o volver a implementarlo, pero puede examinar los procesos en ejecución en la computadora, use el Explorador de procesos. Escribí una descripción detallada aquí .

Enumerará todas las DLL en ejecución en el sistema, es posible que deba determinar la identificación del proceso de su aplicación en ejecución, pero eso generalmente no es demasiado difícil.

He escrito una descripción completa de cómo hacer esto para un dll dentro de IIS - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -servidor/

Bryan
fuente