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

时间:2009-03-05 21:00:07

标签: c# command-line

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

21 个答案:

答案 0 :(得分:383)

System.AppDomain.CurrentDomain.FriendlyName

答案 1 :(得分:212)

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

System.Diagnostics.Process.GetCurrentProcess().ProcessName - 返回文件名,不带扩展名(例如MyApp)。

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

答案 2 :(得分:101)

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

using System;
using System.Diagnostics;

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

答案 3 :(得分:93)

这应该足够了:

Environment.GetCommandLineArgs()[0];

答案 4 :(得分:20)

这是对我有用的代码:

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

上面的所有示例都给了我带有vshost的processName或正在运行的dll名称。

答案 5 :(得分:18)

试试这个:

System.Reflection.Assembly.GetExecutingAssembly()

这将返回一个System.Reflection.Assembly实例,其中包含您可能想要了解的有关当前应用程序的所有数据。我认为Location属性可能会在具体后得到你所拥有的。

答案 6 :(得分:11)

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

会给你的app的FileName像; “MyApplication.exe”

答案 7 :(得分:11)

为什么没人建议,简单。

Path.GetFileName(Application.ExecutablePath)

答案 8 :(得分:9)

更多选择:

  • System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
  • Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase

答案 9 :(得分:8)

    如果未从内存加载程序集,
  • System.Reflection.Assembly.GetEntryAssembly().Location将返回exe名称的位置。
  • System.Reflection.Assembly.GetEntryAssembly().CodeBase将网址作为网址返回。

答案 10 :(得分:8)

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

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

这将确保在VisualStudio中调试和直接在Windows中运行应用程序时名称正确。

答案 11 :(得分:7)

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

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

我不能声称已经测试了每个选项,但它没有做任何愚蠢的事情,比如在调试会话期间返回vhost。

答案 12 :(得分:5)

如果您正在查找可执行文件的完整路径信息,可靠的方法是使用以下内容:

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

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

答案 13 :(得分:4)

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

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

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

答案 14 :(得分:2)

这就是你想要的:

Assembly.GetExecutingAssembly ().Location

答案 15 :(得分:2)

超级简单,在这里:

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

答案 16 :(得分:1)

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

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

答案 17 :(得分:1)

对于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中运行实际的可执行文件还是调试,这都适用于我。

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

约翰

答案 18 :(得分:0)

尝试Application.ExecutablePath

答案 19 :(得分:0)

如果您只需要没有extensio的应用程序名称,则此方法有效:

 Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName);

答案 20 :(得分:-2)

获取路径和名称

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