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

时间:2011-07-26 13:44:32

标签: c#

给出以下代码:

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'保存为commandline.exe

我想获取可执行文件的完整路径和文件名。这段代码几乎可以实现,但它不是100%准确:

  • 如果我从同一目录中将其称为commandline.exe foo bar baz;一切都很好
  • 如果我从同一目录中将其称为commandline foo bar baz,我只获得文件名sans扩展名;不是我想要的
  • 如果我从父目录中将其称为sandbox\commandline foo bar baz;我得到了相对路径和部分文件名

我确信获得可执行文件其他的完整路径和文件名要比字符串操作更容易,对吗?

7 个答案:

答案 0 :(得分:2)

Application.ExecutablePath

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

答案 1 :(得分:1)

那将是

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

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

答案 2 :(得分:1)

使用Assembly.GetExecutingAssembly().CodeBase

答案 3 :(得分:0)

Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly(‌​).Location)

答案 4 :(得分:0)

string path = System.Windows.Forms.Application.ExecutablePath;

答案 5 :(得分:0)

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

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

您可以在以下网址了解详情:HOW TO: Determine the Executing Application's Path

答案 6 :(得分:0)

这就是我们使用的。似乎可以从Visual Studio或独立运行的Console,WinForms和WPF应用程序中运行。

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);