如果我们正在部署单文件应用程序,有没有办法从我们的代码内部获取单文件应用程序
.exe
的路径?
我问的原因是因为我有一个示例控制台应用程序,我想在注册表中注册以在每次 Windows 启动时启动,但遗憾的是每个已知的 API,如
Assembly.GetExecutingAssembly().Location
或 Microsoft 建议的 API AppContext.BaseDirectory
返回相对于控制台应用程序的实际 .dll
文件的路径,而不是解包它的独立 .exe
全部。
来自GitHub问题,@Symbai的建议:
public static class Extensions {
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
static extern uint GetModuleFileName(IntPtr hModule, System.Text.StringBuilder lpFilename, int nSize);
static readonly int MAX_PATH = 255;
public static string GetExecutablePath() {
if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows)) {
var sb = new System.Text.StringBuilder(MAX_PATH);
GetModuleFileName(IntPtr.Zero, sb, MAX_PATH);
return sb.ToString();
}
else {
return System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
}
}
}
我在将 .NET Framework WinForms 应用程序更新到 .NET 9 时遇到了这个问题。
从.NET 6开始,
Environment.ProcessPath
是获取当前运行的可执行文件的完整路径的最简单、最可靠的方法,特别是在单文件发布等场景中。
用法示例:
string exePath = Environment.ProcessPath;
string exeDir = Path.GetDirectoryName(exePath);