studio - obtener ruta donde se ejecuta aplicacion c#
¿Cómo encuentro el nombre de archivo ejecutable actual? (7)
Posible duplicado:
¿Cómo obtengo el nombre del ejecutable actual en C #?
Un archivo ejecutable carga una biblioteca externa.
¿Hay alguna manera de que la biblioteca conozca el archivo ejecutable de la llamada?
(Juraría que vi la respuesta a esto en otro lugar, pero parece que ya no puedo encontrarlo)
Además de las respuestas anteriores.
Escribí siguiendo test.exe como aplicación de consola
static void Main(string[] args) {
Console.WriteLine(
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
Console.WriteLine(
System.Reflection.Assembly.GetEntryAssembly().Location);
Console.WriteLine(
System.Reflection.Assembly.GetExecutingAssembly().Location);
Console.WriteLine(
System.Reflection.Assembly.GetCallingAssembly().Location);
}
Luego compilé el proyecto y cambié el nombre de su salida al archivo test2.exe. Las líneas de salida fueron correctas y lo mismo.
Pero, si lo inicio en Visual Studio, el resultado es:
d: / test2.vhost.exe
d: / test2.exe
d: / test2.exe
C: / Windows / Microsoft.NET / Framework / v2.0.50727 / mscorlib.dll
El complemento ReSharper para Visual Studio ha subrayado el
System.Diagnostics.Process.GetCurrentProcess().MainModule
como sea posible System.NullReferenceException. Si observa la documentación del MainModule, encontrará que esta propiedad también puede arrojar NotSupportedException, PlatformNotSupportedException y InvalidOperationException.
El método GetEntryAssembly tampoco es 100% "seguro". MSDN:
El método GetEntryAssembly puede devolver nulo cuando un ensamblado administrado se ha cargado desde una aplicación no administrada. Por ejemplo, si una aplicación no administrada crea una instancia de un componente COM escrito en C #, una llamada al método GetEntryAssembly desde el componente C # devuelve nulo, porque el punto de entrada para el proceso era un código no administrado en lugar de un ensamblado administrado.
Para mis soluciones, prefiero Assembly.GetEntryAssembly().Location
.
Más interés es si es necesario resolver el problema de la virtualización . Por ejemplo, tenemos un proyecto, donde usamos un Postbuild Xenocode para vincular el código .net en un ejecutable. Este ejecutable debe ser renombrado. Entonces, todos los métodos anteriores no funcionaron, porque solo obtienen la información para el ensamblaje original o el proceso interno.
La única solución que encontré es
var location = System.Reflection.Assembly.GetEntryAssembly().Location;
var directory = System.IO.Path.GetDirectoryName(location);
var file = System.IO.Path.Combine(directory,
System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");
Creo que esto debería ser lo que quieres:
System.Reflection.Assembly.GetEntryAssembly().Location
Esto devuelve el conjunto que se cargó por primera vez cuando se inició el proceso, que parecería ser lo que desea.
GetCallingAssembly
no devolverá necesariamente el conjunto que desee en el caso general, ya que devuelve el conjunto que contiene el método inmediatamente superior en la pila de llamadas (es decir, podría estar en la misma DLL).
Environment.GetCommandLineArgs () [0]
Este no fue incluido:
System.Windows.Forms.Application.ExecutablePath;
~ Joe
Si quieres el ejecutable:
System.Reflection.Assembly.GetEntryAssembly().Location
Si desea el ensamblado que consume su biblioteca (que podría ser el mismo ensamblaje que el anterior, si su código es invocado directamente desde una clase dentro de su ejecutable):
System.Reflection.Assembly.GetCallingAssembly().Location
Si desea solo el nombre del archivo y no la ruta, use:
Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location)
Assembly.GetEntryAssembly()
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName