当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在C#中获取当前可执行文件的名称?》经验,为你挑选了12个好方法。

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



1> Steven A. Lo..:
System.AppDomain.CurrentDomain.FriendlyName


小心接受的答案.我们在Click-Once部署的应用程序下使用`System.AppDomain.CurrentDomain.FriendlyName`时遇到了问题.对我们来说,这是返回"*DefaultDomain*",而不是原始的exe名称.
我们最后使用了这个:`string file = object_of_type_in_application_assembly.GetType().Assembly.Location; string app = System.IO.Path.GetFileNameWithoutExtension(file); `
FriendlyName可以设置为任何内容.如果你有一个带有几个dll的exe,那么获取程序集位置可能还不够.此外,如果您使用多个AppDomain,Assembly.GetCallingAssembly()将返回null.
这可能是有用的,但它不应该是接受的答案:它与所要求的大不相同 - 在某些*情况下巧合的是同样的东西,但这完全是另一回事.如果您没有自己编写应用程序,那么很可能会回复"我喜欢土豆!" 或者你的幽默同事在他们构建应用程序时写入此属性的任何其他内容!
@Gaspode:只是说Path.GetFileNameWithoutExtension(GetType().Assembly.Location)会更容易 - 你不需要在当前程序集中指定一个类型的对象.您可以使用此类型的GetType,然后您甚至不需要说"这个".
这个调用返回的友好名称给了我C:\ Users\root\AppData\Roaming\myapp.vshost.exe vshost.exe部分几乎不是我想要回来的东西......

2> Lee Grissom..:

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()获得与上述相同的结果.


+1我将使用这个答案,因为它以干净简单的方式提供了您可能需要的所有三种变体.使用没有路径或扩展名的裸程序名称对于程序内帮助文本(`/?`switch)非常有用,因为使用扩展名和路径会使它不必要地混乱.
AppDomain可以是EXE应用程序,Web应用程序,单元测试应用程序,Addin Visual Studio和"Silverlight App"(?).对于所有情况,也许是有趣的完整解 例如,对于单元测试VS2012 - ProcessName:vstest.executionengine.x86 MainModule.FileName:C:\ PROGRAM FILES(X86)\ MICROSOFT VISUAL STUDIO 11.0\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\TESTWINDOW\vstest.executionengine.x86.exe MainModule.ModuleName:vstest.executionengine.x86.exe FriendlyName:UnitTestAdapter:运行测试ApplicationName:
记得处理`GetCurrentProcess()`的结果

3> Aaron Daniel..:

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

using System;
using System.Diagnostics;

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


最好使用Process.GetCurrentProcess().MainModule.FileName
在Mono运行时使用时,此方法将失败; 在Mono上运行的应用程序的进程名称将永远是*nixes上的`.../bin/mono`或Windows上的`.../mono.exe`的变体.

4> James B..:

这应该足够了:

Environment.GetCommandLineArgs()[0];


这对我来说是最好的答案,因为`Environment.GetCommandLineArgs()`是来自C/C++的`argv`的C#模拟.
嗯,这返回(从vs.net运行并使用调试托管的东西),filename.vshost.exe的位置和名称...这确实是此时正在执行的文件)

5> Tal Segal..:

这是对我有用的代码:

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

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


对于那些不知道或在其他答案中错过它的人,Assembly的名称空间是System.Reflection,Path的名称空间是System.IO.
如果应用程序入口点是本机代码而不是程序集,则GetEntryAssembly将返回null.

6> Andrew Hare..:

试试这个:

System.Reflection.Assembly.GetExecutingAssembly()

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


注意GetExecutingAssembly():如果从库程序集中调用它,它将返回库程序集的名称,该名称与条目程序集的名称(即原始可执行文件)不同.如果使用GetEntryAssembly(),它将返回实际可执行文件的名称,但如果进程在WCF下运行,则会抛出异常(诚然这是一种罕见的情况).对于最健壮的代码,请使用Process.GetCurrentProcess().ProcessName.
在.NET的卷影复制功能处于活动状态时,使用`CodeBase`代替`Location`可能更安全.见http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx

7> Teoman shipa..:
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name;

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



8> xmen..:

为什么没有人提出这个,简单.

Path.GetFileName(Application.ExecutablePath)


这在Windows窗体应用程序中很有用,但不是这样
Application所在的命名空间.
System.Windows.Forms的

9> JohnB..:

结合更多选择:

System.Reflection.Assembly.GetExecutingAssembly().GetName().Name

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



10> langpavel..:

System.Reflection.Assembly.GetEntryAssembly().Location 如果未从内存加载程序集,则返回exe名称的位置.

System.Reflection.Assembly.GetEntryAssembly().CodeBase 将位置返回为URL.



11> Orwellophile..:

当不确定或有疑问时,在圈子里奔跑,尖叫和喊叫.

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.


+1娱乐。:-)但是,除非我要编写一个不了解其环境的通用类库,否则我几乎不会使用此代码(然后,维护要使用的任何全局状态可能不是一个好主意。的名称)。

12> 小智..:

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

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

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


就我的目的(创建日志文件名),这是最佳答案。如果运行托管进程(例如,服务或Web应用程序),System.AppDomain.CurrentDomain.FriendlyName可以返回带有嵌入式斜杠的难看的GUID-y名称。
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有