四种方法获取可执行程序的文件路径(.NET Core / .NET Framework)
原文:四种方法获取可执行程序的文件路径(.NET Core / .NET Framework)
本文介绍四种不同的获取可执行程序文件路径的方法。适用于 .NET Core 以及 .NET Framework。
本文内容
使用程序集信息获取
var executablePath = Assembly.GetEntryAssembly().Location;
- 1
这种方式的思路是获取入口程序集所在的路径。不过 Assembly.GetEntryAssembly() 能获取到的程序集是入口托管程序集;使用此方法会返回第一个托管程序集。
只有 .NET Framework 程序的入口才是托管程序(exe)。而对于 .NET Core 程序,如果直接发布成带环境依赖声明的 dll,那么实际运行的进程是 dotnet.exe;而如果发布成自包含的 exe 程序,其主 exe 也是一个非托管的 CLR 启动器而已,并不是托管程序集。
所以此方法适用条件:
- 必须是 .NET Framework 程序(.NET Core 程序不适用)
使用应用程序域信息获取
var executablePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
- 1
这种方式的思路是获取当前 AppDomain 所在的文件夹。不过此方法也只是获取到文件夹而已,不包含文件名。
所以此方法适用条件:
- 你不需要知道文件名,只是要一个程序所在的文件夹而已。
当然,此方法因为不涉及到托管和非托管程序集,所以与编译结果无关,适用于 .NET Core 和 .NET Framework 程序。
使用进程信息获取
var executablePath = Process.GetCurrentProcess().MainModule.FileName;
- 1
这种方式的思路是获取当前进程可执行程序的完全路径。
对于 .NET Framework 程序,其 exe 就是这个路径。
对于 .NET Core 程序来说:
- 如果发布成带环境依赖声明的 dll,那么此方法获取到的可执行程序名将是 dotnet.exe,这显然不会是我们预期的行为;
- 如果发布成自包含的 exe,那么此方法获取到的可执行程序名就是程序自己的名称,这是期望的结果。
所以此方法适用条件:
- 适用于 .NET Framework 程序;
- 适用于发布成自包含的 .NET Core 程序。
使用命令行参数获取
我在另一篇博客中提到命令行参数中包含应用程序路径:
于是我们也可以通过命令行参数来获取到可执行程序的路径。
var executablePath = Environment.GetCommandLineArgs()[0];
- 1
这种方法的效果和前面使用进程信息获取的效果是相同的,会获取到相同的可执行程序路径。
总结靠谱的方法
通过以上方法的说明,我们可以知道目前没有 100% 可靠的获取当前可执行程序文件路径的方法,不过可以组合多种方法达到 100% 可靠的目的。
- 如果我们只需要获取程序所在的文件夹
- 那么请直接使用
AppDomain.CurrentDomain.SetupInformation.ApplicationBase
- 那么请直接使用
- 如果我们需要获取到可执行程序的完整路径
- 先通过进程或者命令行参数的方式获取
Process.GetCurrentProcess().MainModule.FileNameEnvironment.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)的更多相关文章
- PHP学习笔记,curl,file_get_content,include和fopen四种方法获取远程文件速度测试.
这几天在做抓取.发现用PHP的file_get_contents函数来获取远程文件的过程中总是出现失败,并且效率很低下.所以就做了个测试的demo来测试下PHP中各种方法获取文件的速度. 程序里面使用 ...
- 5种方法获取url中文件的扩展名
/** * strrchr - 查找指定字符在字符串中的最后一次出现 * strrpos — 计算指定字符串在目标字符串中最后一次出现的位置 * end — 将数组的内部指针指向最后一个单元 * pa ...
- 算法 -- 四种方法获取的最长“回文串”,并对时间复杂进行分析对比&PHP
https://blog.csdn.net/hongyuancao/article/details/82962382 “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就 ...
- JAVA中获取文件MD5值的四种方法
JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...
- PHP读写XML文件的四种方法
PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写.DOMDocument读写. XMLWrite写和XMLReader读.SimpleXML读写,本文将依次对这四种方法进行介 ...
- MYSQL获取自增ID的四种方法
MYSQL获取自增ID的四种方法 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与tabl ...
- YSQL获取自增ID的四种方法(转发)
YSQL获取自增ID的四种方法(转发) 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与t ...
- DBS-MySQL:MYSQL获取自增ID的四种方法
ylbtech-DBS-MySQL:MYSQL获取自增ID的四种方法 1.返回顶部 1. 1. select max(id) from tablename 2.SELECT LAST_INSERT_I ...
- 【Java必修课】通过Value获取Map中的键值Key的四种方法
1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...
随机推荐
- data.table
data.table: Extension of 'data.frame' 安装 data.table install.packages("data.table") 官网:http ...
- 【面向对象】第四单元总结——UML
本单元构架设计 统一建模语言(英语:Unified Modeling Language,缩写 UML)是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的 ...
- mac系统InetAddress.getLocalHost().getHostAddress() 很慢
java.net.InetAddress.getLocalHost() 这个调用在新版的mac os中可能会耗时很久. 解决办法有两种: 1. 就是把本机的hostname 添加到 hosts 中,例 ...
- js进行MD5加密(含中文),与后台JAVA加密之后结果不同(解决)
开发小程序过程中与后台进行接口沟通,前期接口经过MD5加密和AES加密之后,后台进行解密. 今天出现一种情况,我前台加密之后的md5串与后台加密不同,后台发现可能是带用中文的原因, 这是加密之前的串: ...
- Springboot 条件注解
@Conditional 根据满足某一个特定条件创建一个特定的 Bean.就是根据特定条件来控制 Bean 的创建行为,这样我们可以利用这个特性进行一些自动的配置 Springboot 中大量用到了条 ...
- Xcodebuild稳定性测试go脚本
[本文出自天外归云的博客园] 简单封装下xcodebuild test命令,写一个执行xcode测试的go程序,可以设定单case执行次数,也可以二次组装调用进行多个case的测试,代码如下: pac ...
- android分渠道打包,监测日活量统计(基于友盟SDK)
客服说要看App日活,让加个统计功能. (我们技术部已经混到客服部都能直接提需求的地步) 首先接入友盟统计的SDK,在项目外层的build.gradle中添加依赖'https://dl.bintray ...
- 查看当前页面的jsp文件【我】
方法一:可以通过看html类型的请求 方法二:对于有些嵌入的子页面,也可以通过,鼠标右键——此框架——查看框架源代码的方式,直接找到对应的jsp 直接就可以看到对应的jsp:
- Algorithm测试
Algorithm测试 #include <algorithm> #include <vector> #include <iostream> using names ...
- Java读取CSV数据并写入txt文件
读取CSV数据并写入txt文件 package com.vfsd; import java.io.BufferedWriter; import java.io.File; import java.io ...
