我如何获得C#中的当前可执行文件的名称?

我想获取当前正在运行的程序的名称,即程序的可执行文件名称。 在C / C ++中,你可以从args[0]得到它。

 System.AppDomain.CurrentDomain.FriendlyName 

System.AppDomain.CurrentDomain.FriendlyName – 返回带有扩展名的文件名(例如MyApp.exe)。

System.Diagnostics.Process.GetCurrentProcess().ProcessName – 返回没有扩展名的文件名(例如MyApp)。

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName – 返回完整的path和文件名(例如C:\ Examples \ Processes \ MyApp.exe)。 然后,您可以将此传递到System.IO.Path.GetFileName()System.IO.Path.GetFileNameWithoutExtension()以实现与上述相同的结果。

System.Diagnostics.Process.GetCurrentProcess()获取当前正在运行的进程。 您可以使用ProcessName属性来确定名称。 以下是示例控制台应用程序。

 using System; using System.Diagnostics; class Program { static void Main(string[] args) { Console.WriteLine(Process.GetCurrentProcess().ProcessName); Console.ReadLine(); } } 

这应该足够了:

 Environment.GetCommandLineArgs()[0]; 

这是为我工作的代码:

 string fullName = Assembly.GetEntryAssembly().Location; string myName = Path.GetFileNameWithoutExtension(fullName); 

上面的所有例子都给了我processName与vshost或运行的dll名称。

尝试这个:

 System.Reflection.Assembly.GetExecutingAssembly() 

这将返回一个System.Reflection.Assembly实例,它包含您可能想知道的有关当前应用程序的所有数据。 我认为Location属性可能会得到你特定的后。

 System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name; 

会给你的应用程序的FileName像; “MyApplication.exe”

为什么没有人提出这个,它的简单。

 Path.GetFileName(Application.ExecutablePath) 

情侣更多的select:

  • System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
  • Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
  • System.Reflection.Assembly.GetEntryAssembly().Location如果程序集未从内存中加载, System.Reflection.Assembly.GetEntryAssembly().Location将返回exe名称的位置。
  • System.Reflection.Assembly.GetEntryAssembly().CodeBase返回URL的位置。

当不确定或有疑问时,绕圈,尖叫和大喊。

 class Ourself { public static string OurFileName() { System.Reflection.Assembly _objParentAssembly; if (System.Reflection.Assembly.GetEntryAssembly() == null) _objParentAssembly = System.Reflection.Assembly.GetCallingAssembly(); else _objParentAssembly = System.Reflection.Assembly.GetEntryAssembly(); if (_objParentAssembly.CodeBase.StartsWith("http://")) throw new System.IO.IOException("Deployed from URL"); if (System.IO.File.Exists(_objParentAssembly.Location)) return _objParentAssembly.Location; if (System.IO.File.Exists(System.AppDomain.CurrentDomain.BaseDirectory + System.AppDomain.CurrentDomain.FriendlyName)) return System.AppDomain.CurrentDomain.BaseDirectory + System.AppDomain.CurrentDomain.FriendlyName; if (System.IO.File.Exists(System.Reflection.Assembly.GetExecutingAssembly().Location)) return System.Reflection.Assembly.GetExecutingAssembly().Location; throw new System.IO.IOException("Assembly not found"); } } 

我不能声称已经testing过每个选项,但是在debugging会话期间不会做任何像返回虚拟主机一样的蠢事。

如果您正在查找可执行文件的完整path信息,可靠的方法是使用以下命令:

  var executable = System.Diagnostics.Process.GetCurrentProcess().MainModule .FileName.Replace(".vshost", ""); 

这消除了与中间dll,vshost等任何问题

如果您需要程序名称来设置防火墙规则,请使用:

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

这将确保在Visual Studio中进行debugging时以及在Windows中直接运行应用程序时,名称都是正确的。

您可以使用Environment.GetCommandLineArgs()获取参数,并使用Environment.CommandLine获取input的实际命令行。

此外,您可以使用Assembly.GetEntryAssembly()Process.GetCurrentProcess()

但是,在debugging的时候,你应该小心,因为这个最后的例子可能会给你的debugging器的可执行文件的名称(取决于你如何连接debugging器),而不是你的可执行文件,其他例子。

这是你想要的:

 Assembly.GetExecutingAssembly ().Location 

尝试Application.ExecutablePath

超级简单,在这里:

 Environment.CurrentDirectory + "\\" + Process.GetCurrentProcess().ProcessName 

在.Net Core(或Mono)上,当定义进程的二进制文件是Mono或.Net Core(dotnet)的运行时二进制文件,而不是您感兴趣的实际应用程序时,大多数答案将不适用。 , 用这个:

 var myName = Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location); 

对于Windows应用程序(窗体和控制台),我使用这个:

在VS中添加对System.Windows.Forms的引用,然后:

 using System.Windows.Forms; namespace whatever { class Program { static string ApplicationName = Application.ProductName.ToString(); static void Main(string[] args) { ........ } } } 

这对我来说是正确的工作是否我正在运行实际的可执行文件或在VS中debugging。

请注意,它将返回没有扩展名的应用程序名称。

约翰