WPF 中的 Application.ProductName 等效项?

问题描述 投票:0回答:7

我有一个类库,在主 GUI 应用程序下嵌套了两层以上,在该嵌套类库中我希望能够访问主应用程序名称。

在 .Net 3.5 下,您可以调用 Application.ProductName 从 Assembly.cs 文件中检索值,但我无法识别 WPF 中的等效项。如果我使用反射和 GetExecutingAssembly 那么它会返回类库详细信息?

谢谢

c# wpf
7个回答
34
投票

您可以使用

Assembly.GetEntryAssembly()
获取 EXE 程序集,然后使用反射从中获取
AssemblyProductAttribute

这假设产品名称已在 EXE 程序集中设置。 WinForms

Application.ProductName
属性实际上在包含主窗体的程序集中查找,因此即使 GUI 是在 DLL 中构建的,它也可以工作。 要在 WPF 中复制此内容,您可以使用
Application.Current.MainWindow.GetType().Assembly
(并再次使用反射来获取属性)。


8
投票

这是我用来获取产品名称的另一个解决方案

Public Shared Function ProductName() As String
    If Windows.Application.ResourceAssembly Is Nothing Then 
        Return Nothing
    End If

    Return Windows.Application.ResourceAssembly.GetName().Name
End Sub

7
投票

在wpf中有很多方法可以做到这一点, 在这里你可以找到其中两个。

using System;`
using System.Windows;
String applicationName = String.Empty;

//one way
applicationName = AppDomain.CurrentDomain.FriendlyName.Split('.')[0];

 //other way
applicationName = Application.ResourceAssembly.GetName().Name;

5
投票

根据上面的答案,这立即效果很好:

var productName = Assembly.GetEntryAssembly()
    .GetCustomAttributes(typeof(AssemblyProductAttribute))
    .OfType<AssemblyProductAttribute>()
    .FirstOrDefault().Product;

4
投票

如果您需要像我一样获取描述性产品名称,那么此解决方案可能有用:

 // Get the Product Name from the Assembly information
 string productName = String.Empty;
 var list = Application.Current.MainWindow.GetType().Assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), true);
 if (list != null)
 {
   if (list.Length > 0)
   {
     productName = (list[0] as AssemblyProductAttribute).Product;
   }
 }

它返回您在 AssemblyInfo.cs 文件中为“AssemblyProduct”属性设置的任何内容,例如类似于“Widget Engine Professional”。


3
投票

如果您正在查找程序集信息提供的值,例如标题...

enter image description here

...那么你必须像这样获取自定义属性:

using System.Linq;
using System.Reflection;
using System.Windows;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Title = (Assembly.GetEntryAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute)).SingleOrDefault() as AssemblyTitleAttribute)?.Title;
        }
    }
}

enter image description here


2
投票

您需要的答案是:

Path.GetFileName(Assembly.GetEntryAssembly().GetName().Name)
© www.soinside.com 2019 - 2024. All rights reserved.