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


本文内容

  • 使用程序集信息获取
  • 使用应用程序域信息获取
  • 使用进程信息获取
  • 使用命令行参数获取
  • 总结靠谱的方法
  • 另外,关于以上方法的性能对比,你可以参阅林德熙的博客:[dotnet 获取路径各种方法的性能对比](https://blog.lindexi.com/post/dotnet-%E8%8E%B7%E5%8F%96%E7%A8%8B%E5%BA%8F%E6%89%80%E5%9C%A8%E8%B7%AF%E5%BE%84%E7%9A%84%E6%96%B9%E6%B3%95.html)。

使用程序集信息获取

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 程序。

使用命令行参数获取

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

  • .NET 命令行参数包含应用程序路径吗? - 吕毅

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

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/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

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

  1. swf 在html页面平铺,四种方法实现动画SWF文件全屏效果

    如何让SWF文件全屏的效果? 第一种方法: 不显示浏览器菜单栏.工具栏的全屏.这种全屏稍稍复杂,也与 FLASH 的设置无关,但要借助JavaScript来完成.方法是:在HTML文件中间加入以下代码 ...

  2. 12种方法返回2个文件路径之间的公共基路径ExtractBasePath

    方法一:Boris Kumpar function ExtractBasePath(const Path1,Path2:string):string; const   PATH_DELIMITER = ...

  3. phpmyadmin getshell的四种方法

    phpmyadmin常见的getshell的几种方法,一共是四种:1.日志文件写 shell2.在知道绝对路径的情况下,利用INTO OUTFILE 3.慢查询写入webshell4.创建数据库和表写 ...

  4. 下载Word文档的四种方法

    http://www.cnblogs.com/zjyuan/archive/2011/02/14/1954009.html //第一种方法: Response.ClearContent(); Resp ...

  5. java 获取包路径_java获取java文件路径的四种方法

    java获取java文件路径的四种方法 发布时间:2020-04-17 11:03:45 来源:亿速云 阅读:750 作者:小新 今天小编给大家分享的是java获取java文件路径的四种方法,很多人都 ...

  6. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  7. 获取MAC地址的四种方法(转)

    https://www.cnblogs.com/zlshmily/p/10058560.html zlshmily 在实际的应用系统中,我们往往会需要在程序运行时获取当前机器的网卡的MAC地址,以便作 ...

  8. android 图片资源目录下,Android编程实现获取图片资源的四种方法

    本文实例讲述了Android编程实现获取图片资源的四种方法.分享给大家供大家参考,具体如下: 1. 图片放在sdcard中: Bitmap imageBitmap = BitmapFactory.de ...

  9. html获取data-*值,html5 获取和设置data-*属性值的四种方法讲解

    1.获取id的对象 2.需要获取的就是data-id 和 dtat-vice-id的值 一:getAttribute()方法 const getId = document.getElementById ...

最新文章

  1. Linux学习笔记 Day 4~5
  2. Jmeter之逻辑控制器操作
  3. 牛客题霸 NC29 二维数组中的查找
  4. Xml的编码和Bom
  5. TortoiseGit客户端的ssh密钥配置
  6. PHP中$_FILES['file']['error']的用法
  7. 二倍精灵图的做法(以firework为例)
  8. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java文创产品推荐系统设计与实现95ml5
  9. RHEL 6和RHEL 7管理服务的区别
  10. Pr:制作片尾滚动字幕(基本图形法)
  11. 全国计算机软件专业二本大学排名,2017全国二本大学专业排名
  12. Jenkins修改Job工作空间、修改日志路径
  13. [转]SAP模块一句话入门
  14. 如何用easyx播放音乐,插入图片
  15. 在Linux系统下安装更换操作系统
  16. QT中自定义控件和插件大致方法
  17. 【软件测试】—— 水杯测试用例
  18. 心电matlab,基于matlab检测心电信号
  19. Linux中tty、pty、pts的概念及区别
  20. GPIO口的八种工作状态

热门文章

  1. python repl_Python 3.8新特征之asyncio REPL
  2. 全部就业!最高薪资12.5K,黑马这两个学科好牛!
  3. Git提交前端代码遇到Lint errors found in the listed files.和husky - pre-push hook failed (add --no-verify)
  4. 推荐书籍:软件定义网络 SDN与OpenFlow解析
  5. 五猴分桃python_猴子分桃问题 | 学步园
  6. prometheus 阿里云短信告警
  7. 狂妄之人计算机音乐,Undertale音乐 MEGALOVANIA 狂妄之人
  8. linux不能删除文件命令,无法删除文件的解决办法(rm命令的使用)
  9. Incapsula reese84 分析与破解
  10. 服务器管理软件LuManager2.0.99发布,含智能优化