web-dev-qa-db-fra.com

Comment obtenir le titre de l'Assemblée?

Je sais que le remplacement .NET Core de Assembly.GetExecutingAssembly() est typeof(MyType).GetTypeInfo().Assembly, mais qu’en est-il du remplacement 

Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false)

J'ai essayé d'ajouter le dernier bit du code après Assembly pour la première solution mentionnée comme suit:

typeof(VersionInfo).GetTypeInfo().Assembly.GetCustomAttributes(typeof(AssemblyTitleAttribute));

mais cela me donne un message "Impossible de convertir implicitement en objet [].

UPDATE: .__ Oui, comme l'indiquent les commentaires ci-dessous, je pense que cela est lié au type de sortie.

Voici l'extrait de code, et j'essaie simplement de le changer pour qu'il soit compatible avec .Net Core:

public class VersionInfo
{
  public static string AssemlyTitle
  {
    get
    {
      object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
      // More code follows

J'ai essayé de changer ceci pour utiliser CustomAttributeExtensions.GetCustomAttributes( mais je ne comprends pas suffisamment c # pour savoir comment implémenter le même code que ci-dessus. Je suis encore mêlé à propos de MemberInfo et Type, etc. Toute aide est extrêmement appréciée!

10
PirateJubber

Je soupçonne que le problème est dans le code que vous n'avez pas indiqué: où vous utilisez le résultat de GetCustomAttributes(). En effet, Assembly.GetCustomAttributes(Type, bool) DANS .NET FRAMEWORK RENVOIE object[] , alors que CustomAttributeExtensions.GetCustomAttributes(this Assembly, Type) DANS .NET CORE RENVOIE IEnumerable<Attribute> .

Vous devez donc modifier votre code en conséquence. Le moyen le plus simple serait d'utiliser .ToArray<object>(), mais une meilleure solution pourrait être de changer votre code afin qu'il puisse fonctionner avec IEnumerable<Attribute>.

9
svick

Cela fonctionne pour moi dans .NET Core 1.0:

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

namespace SO_38487353
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var attributes = typeof(Program).GetTypeInfo().Assembly.GetCustomAttributes(typeof(AssemblyTitleAttribute));
            var assemblyTitleAttribute = attributes.SingleOrDefault() as AssemblyTitleAttribute;

            Console.WriteLine(assemblyTitleAttribute?.Title);
            Console.ReadKey();
        }
    }
}

AssemblyInfo.cs

using System.Reflection;

[Assembly: AssemblyTitle("My Assembly Title")]

project.json

{
  "buildOptions": {
    "emitEntryPoint": true
  },
  "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.0"
    },
    "System.Runtime": "4.1.0"
  },
  "frameworks": {
    "netcoreapp1.0": { }
  }
}
8
Nate Barbettini

Cela fonctionne pour moi:

public static string GetAppTitle()
{
    AssemblyTitleAttribute attributes = (AssemblyTitleAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyTitleAttribute), false);

    return attributes?.Title;
}
5
thiagofalcao

Ne serait-ce pas le plus simple?

string title = Assembly.GetExecutingAssembly().GetCustomAttribute<AssemblyTitleAttribute>().Title;

Dis-moi juste.

1
user3089358

C'est ce que j'utilise: 

private string GetApplicationTitle => ((AssemblyTitleAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyTitleAttribute), false))?.Title ?? "Unknown Title";
0
Mike