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

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

El problema que estoy teniendo es que el lugar donde pongo el archivo dll y config no es la “ubicación actual” cuando la aplicación se está ejecutando.

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

D: \ Archivos de progtwig \ Microsoft Team Foundation Server 2010 \ Nivel de aplicación \ Servicios web \ bin \ Plugins

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

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

entonces . \ AggregatorItems.xml se traduce en:

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

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

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

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

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

Editar:

Aparentemente, la propiedad de Location no funciona correctamente bajo ciertas condiciones (prueba usando NUnit, DLL instanciado TFS, Outlook?) – en ese caso puede usar la propiedad CodeBase .

La reflexión es tu amigo, como se ha señalado. Pero debes 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. 

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 conjunto. Otros han señalado métodos alternativos para ubicar el ensamblaje.

 System.Reflection.Assembly.GetExecutingAssembly().Location 

Si está trabajando con una aplicación asp.net y desea ubicar ensamblajes al usar 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 del 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 Process Explorer. Escribí una descripción detallada aquí .

Enumerará todos los dlls ejecutables en el sistema, es posible que necesite determinar el id. De 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/