在C#开发中,获取当前可执行文件的名称是常见需求,可用于程序标识、路径计算、日志输出等多个场景,不同实现方式的原理和适用环境存在差异。
方法一:通过Assembly获取
程序集(Assembly)是.NET程序的基本部署单元,当前执行的程序对应的程序集信息中包含了可执行文件的相关属性,我们可以通过Assembly类来获取这些信息。
这种方式获取的是程序集的名称,默认情况下和可执行文件名称一致,除非手动修改了程序集的名称属性。示例代码如下:
using System.Reflection;
class Program
{
static void Main()
{
// 获取当前运行的程序集
Assembly currentAssembly = Assembly.GetExecutingAssembly();
// 获取程序集名称,默认和可执行文件名称相同
string assemblyName = currentAssembly.GetName().Name;
Console.WriteLine($"通过Assembly获取的名称:{assemblyName}");
// 如果需要获取带后缀的文件名,可结合Location属性处理
string assemblyLocation = currentAssembly.Location;
string fileNameWithExtension = System.IO.Path.GetFileName(assemblyLocation);
Console.WriteLine($"带后缀的可执行文件名:{fileNameWithExtension}");
}
}
方法二:通过Process获取
当前运行的程序本身是一个操作系统进程,我们可以通过Process类获取当前进程的信息,其中包含主模块的模块名,也就是可执行文件的名称。
这种方式直接依赖操作系统的进程信息,获取的结果是实际运行的exe文件的名称,示例代码如下:
using System.Diagnostics;
class Program
{
static void Main()
{
// 获取当前进程
Process currentProcess = Process.GetCurrentProcess();
// 获取主模块的模块名,即可执行文件名称
string processModuleName = currentProcess.MainModule.ModuleName;
Console.WriteLine($"通过Process获取的名称:{processModuleName}");
// 也可以获取主模块的完整路径后提取文件名
string processFilePath = currentProcess.MainModule.FileName;
string fileNameFromPath = System.IO.Path.GetFileName(processFilePath);
Console.WriteLine($"从路径提取的文件名:{fileNameFromPath}");
}
}
方法三:通过AppDomain获取
应用程序域(AppDomain)是.NET中的运行隔离单元,当前应用程序域的基目录和可执行文件的路径相关,我们可以通过AppDomain类的相关属性来获取可执行文件信息。
这种方式适用于需要获取可执行文件所在目录结合文件名计算的场景,示例代码如下:
using System;
class Program
{
static void Main()
{
// 获取当前应用程序域
AppDomain currentDomain = AppDomain.CurrentDomain;
// 获取可执行文件的完整路径
string exePath = currentDomain.SetupInformation.ApplicationBase;
// 如果路径末尾带斜杠,先去除斜杠再提取文件名
exePath = exePath.TrimEnd('\', '/');
string exeName = System.IO.Path.GetFileName(exePath);
Console.WriteLine($"通过AppDomain获取的名称:{exeName}");
// 也可以直接获取友好名称
string friendlyName = currentDomain.FriendlyName;
Console.WriteLine($"应用程序域友好名称:{friendlyName}");
}
}
不同方法对比
我们可以根据实际需求选择合适的方法,下面是三种方法的特性对比:
| 实现方式 | 获取结果特点 | 适用场景 |
|---|---|---|
| Assembly方式 | 默认是程序集名称,可扩展获取带后缀文件名 | 需要程序集元信息、不依赖操作系统进程的场景 |
| Process方式 | 直接是操作系统层面的exe文件名 | 需要精确获取实际运行的exe文件名、依赖进程信息的场景 |
| AppDomain方式 | 可结合应用程序域配置获取路径相关文件名 | 需要获取可执行文件所在目录、结合路径计算的场景 |
注意事项
- 如果程序是通过ClickOnce等方式部署的,部分方法的返回结果可能和预期不一致,需要提前测试部署环境下的表现。
- 当程序被重命名后,Assembly方式获取的程序集名称不会变化,而Process方式获取的是重命名后的文件名。
- 在部分特殊运行环境(如托管环境、沙箱环境)中,Process类可能无法访问进程信息,此时建议优先使用Assembly方式。