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

栏目: ASP.NET · 发布时间: 5年前

内容简介:本文介绍四种不同的获取可执行程序文件路径的方法。适用于 .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 获取路径各种方法的性能对比


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Realm of Racket

Realm of Racket

Matthias Felleisen、Conrad Barski M.D.、David Van Horn、Eight Students Northeastern University of / No Starch Press / 2013-6-25 / USD 39.95

Racket is the noble descendant of Lisp, a programming language renowned for its elegance and power. But while Racket retains the functional goodness of Lisp that makes programming purists drool, it wa......一起来看看 《Realm of Racket》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换