使用C#获取可执行文件的绝对路径?

69 c# directory executable

看看这个伪代码:

string exe_path = system.get_exe_path()
print "This executable is located in " + exe_path
Run Code Online (Sandbox Code Playgroud)

如果我构建上述程序并将可执行文件放入C:/meow/其中This executable is located in C:/meow/,则无论当前工作目录如何,它都会在每次运行时打印出来.

我怎么能轻易地完成这个使用C#

Mar*_*off 100

MSDN有一篇文章说要使用System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase; 如果您需要该目录,请使用System.IO.Path.GetDirectoryName该结果.

或者,有更短的Application.ExecutablePath"获取启动应用程序的可执行文件的路径,包括可执行文件名",这可能意味着它的可靠性稍差,具体取决于应用程序的启动方式.

  • 上述方法将当前路径作为URI返回(即"file:// c:\\ data").有用的是:`System.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));` (50认同)
  • System.Reflection.Assembly.GetExecutingAssembly()只会获取EXE程序集,如果它是从哪里调用的话.GetEntryAssembly()将获得正确的程序集. (28认同)
  • 它实际上是"System.IO.Path".因此具有正确名称空间的完全限定名称应为:System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) (17认同)
  • noelicus:根据答案和评论,几乎总能正常工作的安全准确的方法是:System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) (9认同)
  • 如果您创建Windows服务,这一点尤为重要,因为该服务是从C:\ Windows\System32启动的,因此您将拥有该工作目录.我将改用GraemeF的方法. (5认同)

Liq*_*ore 44

AppDomain.CurrentDomain.BaseDirectory
Run Code Online (Sandbox Code Playgroud)

  • 这是最好,最简单的答案.无论当前目录如何,此方法都适用于linux/mono和Windows. (7认同)

小智 12

using System.Reflection;

string myExeDir = new FileInfo(Assembly.GetEntryAssembly().Location).Directory.ToString();
Run Code Online (Sandbox Code Playgroud)

  • 很好,尽管它可以简化为“System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)”,这也更快。 (3认同)

use*_*er1 5

var dir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
Run Code Online (Sandbox Code Playgroud)

我跳入评分最高的答案,发现自己没有得到预期的结果。我必须阅读评论才能找到我要找的东西。

出于这个原因,我发布了评论中列出的答案,以给予它应有的曝光度。

  • 很好,虽然它应该是 `.GetEntryAssembly()`,而不是 `.GetExecutingAssembly()`。 (2认同)