我有一个类库,在主 GUI 应用程序下嵌套了两层以上,在该嵌套类库中我希望能够访问主应用程序名称。
在 .Net 3.5 下,您可以调用 Application.ProductName 从 Assembly.cs 文件中检索值,但我无法识别 WPF 中的等效项。如果我使用反射和 GetExecutingAssembly 那么它会返回类库详细信息?
谢谢
您可以使用
Assembly.GetEntryAssembly()
获取 EXE 程序集,然后使用反射从中获取 AssemblyProductAttribute
。
这假设产品名称已在 EXE 程序集中设置。 WinForms
Application.ProductName
属性实际上在包含主窗体的程序集中查找,因此即使 GUI 是在 DLL 中构建的,它也可以工作。 要在 WPF 中复制此内容,您可以使用 Application.Current.MainWindow.GetType().Assembly
(并再次使用反射来获取属性)。
这是我用来获取产品名称的另一个解决方案
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
在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;
根据上面的答案,这立即效果很好:
var productName = Assembly.GetEntryAssembly()
.GetCustomAttributes(typeof(AssemblyProductAttribute))
.OfType<AssemblyProductAttribute>()
.FirstOrDefault().Product;
如果您需要像我一样获取描述性产品名称,那么此解决方案可能有用:
// 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”。
如果您正在查找程序集信息提供的值,例如标题...
...那么你必须像这样获取自定义属性:
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;
}
}
}
您需要的答案是:
Path.GetFileName(Assembly.GetEntryAssembly().GetName().Name)