什么';在c#中获取调用的可执行文件的完整路径和文件名的最佳方法是什么

本文关键字:路径 文件名 是什么 方法 最佳 可执行文件 什么 调用 获取 | 更新日期: 2023-09-27 18:03:48

给定以下代码:

using System;
namespace Sandbox
{
   class CommandLine
   {
      static void Main()
      {
         String[] args = Environment.GetCommandLineArgs();
         String executable = args[0];
         String[] paramList = getParamList(args);
         System.Console.WriteLine("Directory ....... {0}", Environment.CurrentDirectory);
         System.Console.WriteLine("Executable ...... {0}", args[0]);
         System.Console.WriteLine("Params .......... {0}", String.Join(", ", paramList));
      }
      private static String[] getParamList(String[] args)
      {
         String[] paramList = new String[args.Length - 1];
         for (int i = 1; i < args.Length; i++) 
         {
            int j = i - 1;
            paramList[j] = args[i];
         }
         return paramList;
      }
   }
}

保存为commandline.cs和csc'd到commandline.exe

我想得到被调用的可执行表的完整路径和文件名。这个代码几乎做到了,但它不是100%准确:

  • 如果我从同一目录将其称为CCD_ 2;一切都很好
  • 如果我从同一个目录中将其称为commandline foo bar baz,那么我只得到无扩展名的文件名;不是我想要的
  • 如果我从父目录中将其称为CCD_ 4;我得到了相对路径和部分文件名

我相信有一种比字符串操作更容易获得其他可执行文件的完整路径和文件名的方法,对吧?

什么';在c#中获取调用的可执行文件的完整路径和文件名的最佳方法是什么

Application.ExecutablePath.

请注意,这需要引用system.windows.forms

这将是

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName

不过,请注意,当从Visual Studio中运行应用程序时,这很可能会返回vshost文件的完整路径。

使用Assembly.GetExecutingAssembly().CodeBase

System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase;

Application.ExecutablePath将为您提供执行代码的应用程序的路径。例如,调用你的dll的应用程序。上面的行为您提供了应用程序的完整路径。

您可以在以下位置阅读更多信息:如何:确定执行应用程序的路径

string path = System.Windows.Forms.Application.ExecutablePath;
Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly(‌​).Location)

这就是我们使用的。似乎可以在控制台、WinForms和WPF应用程序中工作,这些应用程序运行于Visual Studio或单机版。

System.Reflection.Assembly entryAssembly = 
    System.Reflection.Assembly.GetEntryAssembly();
string applicationPath = entryAssembly != null ? entryAssembly.Location :
    System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
string applicationDirectory = Path.GetDirectoryName(applicationPath);