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")
C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
Assembly.GetExecutingAssembly().CodeBase
tiene!string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
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.
fuente
En mi caso (tratando con mis ensamblajes cargados [como archivo] en Outlook):
typeof(OneOfMyTypes).Assembly.CodeBase
Tenga en cuenta el uso de
CodeBase
(noLocation
) en elAssembly
. Otros han señalado métodos alternativos para ubicar el conjunto.fuente
fuente
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/
fuente