Además de las respuestas anteriores.
escribí siguiente 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);
}
A continuación he recopilado el proyecto y renombró su salida al archivo test2.exe. Las líneas de salida fueron correctas y lo mismo.
Pero, si lo inicio en el 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 sistema posible.Excepcion de referencia nula. 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 volver nula cuando un ensamblado administrado se ha cargado desde una aplicación no administrado. Por ejemplo, si una aplicación no administrada crea una instancia de un componente COM escrito en C#, una llamada al método GetEntryAssembly del componente C# devuelve nulo, porque el punto de entrada para el proceso no fue administrado en lugar de un ensamblaje administrado .
Para mis soluciones, prefiero Assembly.GetEntryAssembly().Location
.
Más interés es si necesita resolver el problema para 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 he encontrado 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");
Este tiende a agregar ".vhost". en el nombre de archivo, un problema no presente si se usa System.Reflection.Assembly.GetEntryAssembly(). Ubicación (ver respuesta alternativa). – Contango
@Contango, que se produce al usar "Visual Studio Hosting Process" en VS. – LuddyPants
Para pruebas unitarias en VS 2012. ProcessName: vstest.executionengine.x86 ConfigurationFile: C: \ TFS \ Tests \ MyData.Tests.v4.0 \ bin \ Debug \ MyData.Tests.v4.0.dll.config MainModule.FileName: C: \ ARCHIVOS DE PROGRAMA (X86) \ MICROSOFT VISUAL STUDIO 11.0 \ COMMON7 \ IDE \ COMMONEXTENSIONS \ MICROSOFT \ TESTWINDOW \ vstest.executionengine.x86.exe MainModule.ModuleName: vstest.executionengine.x86.exe FriendlyName : UnitTestAdapter: Running test – Kiquenet