从程序集与进程中获取当前可执行文件的名称

本文关键字:可执行文件 获取 程序集 进程 | 更新日期: 2023-09-27 18:17:03

这是对这个答案(以及它的评论)的跟进。从程序集与过程中获得可执行名称的区别是什么?

System.Reflection.Assembly.GetCallingAssembly.GetEntryAssembly().CodeBase 

Process.GetCurrentProcess().ProcessName

我假设这些将是相同的所有时间?没有?有利有弊吗?

从程序集与进程中获取当前可执行文件的名称

它们不一定相同。将这两个程序作为控制台应用程序编译到同一目录下:

// In Test.cs, compile to Test.exe
using System;
using System.Reflection;
public static class Program
{
    static void Main(string[] args)
    {
        AppDomain.CreateDomain("NewDomain").ExecuteAssembly("Test2.exe");
    }
}
// In Test2.cs, compile to Test2.exe
using System;
using System.Diagnostics;
using System.Reflection;
class Test2
{
    static void Main()
    {
        Console.WriteLine("Process: {0}",
                          Process.GetCurrentProcess().ProcessName);
        Console.WriteLine("Entry assembly: {0}", 
                          Assembly.GetEntryAssembly().CodeBase);
    }
}
输出:

Process: Test
Entry assembly: file:///c:/Users/Jon/Test/Test2.EXE

ProcessName是操作系统主机进程的名称。

Assembly CodeBase指向给定进程中的程序集。同一个程序集可以由不同的进程承载。

不,它们不需要返回相同的值。

碰巧,我最近遇到了这个"gotcha":它们可以返回不同的值,这取决于你是直接运行。exe,还是从MSVS调试器内部:

如何获得c#控制台应用程序的。exe名称?

这只是一个例子,我相信还会有其他的例子。

希望这对你有帮助!