【问题标题】:What is the right way of getting my WinForms application's name?获取我的 WinForms 应用程序名称的正确方法是什么?
【发布时间】:2026-01-04 05:45:01
【问题描述】:

我可以这样做

return Assembly.GetEntryAssembly().GetName().Name;

return Path.GetFileNameWithoutExtension(Application.ExecutablePath);

是否都会总是给出所需的应用程序名称?如果是这样,哪个是获取应用程序名称的更标准方法?如果它仍然是一个没有胜利的情况,是否有一种方法比另一种更快?或者还有其他正确的做法吗?

【问题讨论】:

  • 很难猜出“应用程序名称”是什么意思,上下文很重要。两者都将返回 EXE 文件名。与进程名称相同。
  • @HansPassant 哦,我的意思是我的产品的主要名称。例如,对于 MS Word,它是“Microsoft Word”而不是“WINWORD”。就我而言,我在应用程序属性中硬编码为程序集名称的那个名称。获得它的方法是什么?

标签: c# winforms .net-assembly application-name executable-path


【解决方案1】:

这取决于您如何定义“应用程序名称”。

Application.ExecutablePath 返回启动应用程序的可执行文件的路径,包括可执行文件名,这意味着如果有人重命名该文件,则值会发生变化。

Assembly.GetEntryAssembly().GetName().Name 返回程序集的简单名称。这通常但不一定是程序集清单文件的文件名,减去其扩展名

因此,GetName().Name 似乎更亲民。

对于更快的,我不知道。我认为 ExecutablePath 比 GetName() 更快,因为在 GetName() 中需要反射,但这应该测量。

编辑:

尝试构建此控制台应用程序,运行它,然后尝试使用 Windows 文件资源管理器重命名可执行文件名,双击重命名的可执行文件直接再次运行。
ExecutablePath 反映了变化,Assembly 名称还是一样的

using System;
using System.Reflection;
using System.Windows.Forms;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Assembly.GetEntryAssembly().GetName().Name);
            Console.WriteLine(Application.ExecutablePath);
            Console.ReadLine();
        }
    }
}

【讨论】:

  • 你知道它们在哪种情况下不同吗?可执行文件名称(来自ExecutablePath)似乎正是程序集的名称。
【解决方案2】:
【解决方案3】:

根据您考虑的应用程序名称,甚至还有第三种选择:获取程序集标题或产品名称(通常在AssemblyInfo.cs 中声明):

object[] titleAttributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), true);
if (titleAttributes.Length > 0 && titleAttributes[0] is AssemblyTitleAttribute)
{
    string assemblyTitle = (titleAttributes[0] as AssemblyTitleAttribute).Title;
    MessageBox.Show(assemblyTitle);
}

或:

object[] productAttributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), true);
if (productAttributes.Length > 0 && productAttributes[0] is AssemblyProductAttribute)
{
    string productName = (productAttributes[0] as AssemblyProductAttribute).Product;
    MessageBox.Show(productName);
}

【讨论】:

  • 为什么titleAttributes[0] is AssemblyTitleAttribute在这里检查?我们已经查询过同样的事情了对吧?
  • @nawfal:是的,你是对的,数组中的项目不太可能是任何其他类型,但某些静态代码分析工具(如 ReSharper)会将此代码标记为潜在的NullReferenceException 威胁,因为如果obj 不是Tobj as T 表达式将评估为null。通过在obj as T 之前写obj is T,这些工具将在编译时知道不会抛出异常。
  • 是的,我明白了。虽然我当然使用了您的代码来获取应用程序标题,但我认为 Application.ProductName 是最短和最简单的问题。
  • @nawfal:是的,你做对了,Application.ProductName 是 WinForms 应用程序的不错选择。如果应用程序不是 Windows 窗体,则查询属性会有所帮助。确切地说,Application.ProductName 的内部实现会检索 AssemblyProductAttribute 值并将其缓存。
  • Application.ProductName and Application.ProductVersion 适用于 NET Core 3.1。还有Assembly and MessageBox.Show ?
最近更新 更多