2010-02-23 18 views
15

Posiadam bibliotekę klas, która jest zagnieżdżona w dwóch warstwach pod główną aplikacją GUI, w tej zagnieżdżonej bibliotece klas Chcę mieć dostęp do głównej nazwy aplikacji.Application.ProductName odpowiednik w WPF?

W .NET 3.5 można wywołać Application.ProductName w celu pobrania wartości z pliku Assembly.cs, ale nie mogę zidentyfikować odpowiednika w WPF. Jeśli używam refleksji i GetExecutingAssembly, to zwraca szczegóły bibliotek klas?

Dzięki

+0

Jeśli pisał kod działa, można zaznaczyć pisał odpowiedź jako poprawna. :) – Vlad

Odpowiedz

28

Można użyć Assembly.GetEntryAssembly() dostać zespół EXE, a następnie można użyć odbicie uzyskać AssemblyProductAttribute od tego.

Zakłada się, że nazwa produktu została ustawiona na zespole EXE. Właściwość WinForms Application.ProductName rzeczywiście wyglądała w zestawie zawierającym główny formularz, więc działa nawet wtedy, gdy GUI jest wbudowany w bibliotekę DLL. Aby zreplikować to w WPF, należy użyć Application.Current.MainWindow.GetType().Assembly (i ponownie użyć Odbicia, aby uzyskać atrybut).

+7

Bardzo dziękuję za szybką odpowiedź, dodaliśmy następujące i działa jak urok: Application.Current.MainWindow.GetType(). Assembly.GetName(). Nazwa – woany

+1

Należy pamiętać, że GetEntryAssembly() może zwrócić wartość null pewne okoliczności. – BladeWise

+0

Tu znowu po chwili. – dotNET

2

Odpowiedź potrzebna jest:

Path.GetFileName(Assembly.GetEntryAssembly().GetName().Name) 
+4

Więc, zasadniczo, twoja skarga jest taka, że ​​"zbyt wielu ludzi" robi coś więcej niż tylko daje kodek? Nie zgadzam się; w wyjaśnieniu jest wiele korzyści.Zbyt wielu ludzi kopiuje i wkleja kod, który znajdują online w swoim projekcie. To jest * znacznie * gorsze zjawisko. –

+1

Nazwa zespołu różni się od nazwy produktu. Application.Product name daje atrybut AssemblyProduct ustawiony dla zespołu. Nazwa zestawu jest nazwą zespołu, tj. Nazwą fizyczną w systemie plików, do którego się kompiluje. – nawfal

7

Oto kolejne rozwiązanie, które używam, aby uzyskać Nazwa produktu

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 
4

Jeśli trzeba uzyskać opisową nazwę produktu jak ja, to rozwiązanie może być przydatne:

// 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; 
    } 
} 

Zwraca to, co zostało ustawione dla "AssemblyProdu" ct 'atrybut w pliku AssemblyInfo.cs, np. coś w rodzaju "Widget Engine Professional".

3

w WPF jest na to wiele sposobów, tutaj można znaleźć dwa z nich.

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

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

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

Na podstawie powyższych odpowiedzi, to działa tylko wielki natychmiast:

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

Tak, dziękuję, działa dobrze, gdy w moim przypadku mainwindow nie jest jeszcze utworzony. –

0

Jeśli szukasz wartości dostarczonych przez informacje montażowej, na przykład tytuł ...

enter image description here

... potem trzeba dostać zwyczaj atrybuty tak:

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