专栏首页walterlv - 吕毅的博客四种方法获取可执行程序的文件路径(.NET Core / .NET Framework)

四种方法获取可执行程序的文件路径(.NET Core / .NET Framework)

本文介绍四种不同的获取可执行程序文件路径的方法。适用于 .NET Core 以及 .NET Framework。


使用程序集信息获取

var executablePath = Assembly.GetEntryAssembly().Location;

这种方式的思路是获取入口程序集所在的路径。不过 Assembly.GetEntryAssembly() 能获取到的程序集是入口托管程序集;使用此方法会返回第一个托管程序集。

只有 .NET Framework 程序的入口才是托管程序(exe)。而对于 .NET Core 程序,如果直接发布成带环境依赖声明的 dll,那么实际运行的进程是 dotnet.exe;而如果发布成自包含的 exe 程序,其主 exe 也是一个非托管的 CLR 启动器而已,并不是托管程序集。

所以此方法适用条件:

  1. 必须是 .NET Framework 程序(.NET Core 程序不适用)

使用应用程序域信息获取

var executablePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

这种方式的思路是获取当前 AppDomain 所在的文件夹。不过此方法也只是获取到文件夹而已,不包含文件名。

所以此方法适用条件:

  1. 你不需要知道文件名,只是要一个程序所在的文件夹而已。

当然,此方法因为不涉及到托管和非托管程序集,所以与编译结果无关,适用于 .NET Core 和 .NET Framework 程序。

使用进程信息获取

var executablePath = Process.GetCurrentProcess().MainModule.FileName;

这种方式的思路是获取当前进程可执行程序的完全路径。

对于 .NET Framework 程序,其 exe 就是这个路径。

对于 .NET Core 程序来说:

  1. 如果发布成带环境依赖声明的 dll,那么此方法获取到的可执行程序名将是 dotnet.exe,这显然不会是我们预期的行为;
  2. 如果发布成自包含的 exe,那么此方法获取到的可执行程序名就是程序自己的名称,这是期望的结果。

所以此方法适用条件:

  1. 适用于 .NET Framework 程序;
  2. 适用于发布成自包含的 .NET Core 程序。

使用命令行参数获取

我在另一篇博客中提到命令行参数中包含应用程序路径:

于是我们也可以通过命令行参数来获取到可执行程序的路径。

var executablePath = Environment.GetCommandLineArgs()[0];

这种方法的效果和前面使用进程信息获取的效果是相同的,会获取到相同的可执行程序路径。

总结靠谱的方法

通过以上方法的说明,我们可以知道目前没有 100% 可靠的获取当前可执行程序文件路径的方法,不过可以组合多种方法达到 100% 可靠的目的。

  1. 如果我们只需要获取程序所在的文件夹
    • 那么请直接使用 AppDomain.CurrentDomain.SetupInformation.ApplicationBase
  2. 如果我们需要获取到可执行程序的完整路径
    • 先通过进程或者命令行参数的方式获取
      • Process.GetCurrentProcess().MainModule.FileName
      • Environment.GetCommandLineArgs()[0]
    • 如果得到的进程是 dotnet.exe,那么再通过程序集信息获取
      • Assembly.GetEntryAssembly().Location

另外,关于以上方法的性能对比,你可以参阅林德熙的博客:dotnet 获取路径各种方法的性能对比

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/get-current-executable-file-path.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • .NET 三个字母究竟应该如何大小写?前面的 “.” 什么时候能够去掉?(.NET Standard / dotnet-core / net472)

    发布于 2018-05-28 08:23 更新于 2018-07...

    walterlv
  • .NET Standard 的管理策略

    2018-07-08 14:28

    walterlv
  • WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了

    如果你写了一个 MarkupExtension 在 XAML 当中使用,你会发现你在 MarkupExtension 中定时的属性是无法使用 XA...

    walterlv
  • 这些是 3 月里最「浪」的小程序

    知晓君
  • TW洞见 | 用“五个为什么”写CSS

    今日洞见 文章作者来自:ThoughtWorks - 张铮铮。封面图片来自网络。 本文版权归【ThoughtWorks中国】(微信ID:思特沃克ThoughtW...

    ThoughtWorks
  • 将打飞机游戏打包成 exe

    发现很多朋友在写了 pygame 的打飞机游戏之后,都很想打包成 exe 文件分享给别人玩。但是在打包的过程中,可能遇到一些问题。今天我就来整理一下 pygam...

    Crossin先生
  • Linux文件归档之tar

    tar相信大家也比较熟悉了,它是一个常见的压缩文档格式,在linux中它是用来压缩文件的一个命令。在操作之前先来张各个选项的详细解释图片

    雨落凋殇
  • 用神经模块网络学习推理

    (与 Ronghang Hu, Marcus Rohrbach, Trevor Darrell, Dan Klein and Kate Saenko合作)

    人工智能资讯小编
  • python 各类距离公式实现

    两个n维变量A(x11,x12,…,x1n)与 B(x21,x22,…,x2n)间的闵可夫斯基距离定义为:

    周小董
  • 7620:区间合并

    7620:区间合并 查看 提交 统计 提问 总时间限制:1000ms内存限制:65536kB描述 给定 n 个闭区间 [ai; bi],其中i=1,2,...,...

    attack

扫码关注云+社区

领取腾讯云代金券