2010-02-23 14 views
15

Tengo una biblioteca de clases que está anidada dos + capas bajo una aplicación GUI principal, dentro de esa biblioteca de clases anidadas Deseo poder acceder al nombre de las aplicaciones principales.Application.ProductName equivalente en WPF?

En .Net 3.5 puede llamar a Application.ProductName para recuperar el valor del archivo Assembly.cs, pero no puedo identificar un equivalente en WPF. Si uso reflection y GetExecutingAssembly, ¿devuelve los detalles de las bibliotecas de clase?

Gracias

+0

Si el código publicado funciona, podría marcar el publicado responde como correcto :) – Vlad

Respuesta

28

Puede utilizar Assembly.GetEntryAssembly() para obtener el conjunto de EXE, y luego pueden utilizar la reflexión para obtener el AssemblyProductAttribute de eso.

Esto supone que el nombre del producto se ha establecido en el ensamblado EXE. La propiedad WinForms Application.ProductName realmente miró en el ensamblado que contiene el formulario principal, por lo que funciona incluso si la GUI está integrada en una DLL. Para replicar esto en WPF usaría Application.Current.MainWindow.GetType().Assembly (y de nuevo use Reflection para obtener el atributo).

+7

Muchas gracias por su respuesta rápida, han agregado lo siguiente y funciona como un encanto: Application.Current.MainWindow.GetType(). Assembly.GetName(). Nombre – woany

+1

Tenga en cuenta que GetEntryAssembly() podría devolver nulo en ciertas circunstancias. – BladeWise

+0

Aquí de nuevo después de un tiempo. – dotNET

2

La respuesta que necesita es:

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

Entonces, básicamente, ¿su queja es que "demasiada gente" hace más que simplemente darle el código? Estoy en desacuerdo; hay muchos beneficios en la explicación.Demasiadas personas copian y pegan el código que encuentran en línea en su proyecto. Ese es un fenómeno * mucho * peor. –

+1

El nombre del ensamblado es diferente del nombre del producto. Application.Product name le proporciona el atributo AssemblyProduct establecido para el ensamblaje. El nombre del ensamblado es el nombre del ensamblado, es decir, el nombre físico en el sistema de archivos al que se compila. – nawfal

7

Aquí hay otra solución que estoy usando para obtener el nombre del producto

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

Si usted necesita para obtener el nombre del producto descriptiva como lo hice, entonces esta solución puede ser útil:

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

Devuelve lo que haya configurado para el 'AssemblyProdu atributo ct 'en el archivo AssemblyInfo.cs, p. algo así como "Widget Engine Professional".

3

en wpf hay muchas maneras de hacerlo, aquí puede encontrar dos de esto.

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

Con base en las respuestas anteriores, esto funciona simplemente genial inmediato:

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

Sí, gracias, funciona bien cuando, en mi caso, la ventana principal aún no está creada. –

0

Si su búsqueda de los valores proporcionados por la información de ensamblado, por ejemplo, el título ...

enter image description here

... entonces usted tiene que conseguir los atributos personalizados como esto:

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