2016-07-20 20 views
8

Ich weiß, dass die .NET-Core-Ersatz für Assembly.GetExecutingAssembly() ist typeof(MyType).GetTypeInfo().Assembly, aber was ist mit dem Ersatz fürWie bekomme ich das AssemblyTitle?

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

habe ich versucht, das letzte Stück des Codes nach der Montage für die erste Lösung, wie so genannte anhängt:

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

aber es gibt mir ein „Kann nicht implizit konvertieren [einzuwenden] Nachricht

UPDATE:. Ja, wie die Kommentare unten zeigen, glaube ich, dass es mit dem Ausgabetyp verknüpft ist. Hier

ist der Code-Schnipsel, und ich versuche nur, es zu ändern kompatibel zu sein mit .Net Kern:

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

Ich habe versucht, dies zu ändern CustomAttributeExtensions.GetCustomAttributes( zu verwenden, aber ich weiß nicht zur Zeit verstehen C# genug wissen, wie man den gleichen Code wie oben implementiert. Ich bin immer noch verwirrt über MemberInfo und Type und dergleichen. Jede Hilfe wird sehr geschätzt!

+0

Wo sehen Sie die Fehlermeldung erhalten? Ist 'VersionInfo' in derselben Assembly wie das 'AssemblyTitle', das Sie lesen möchten? –

Antwort

9

ich, dass das Problem vermuten ist in Code, den du nicht gezeigt hast: wo y Verwenden Sie das Ergebnis GetCustomAttributes(). Das liegt daran, Assembly.GetCustomAttributes(Type, bool) in .Net Framework returns object[], während CustomAttributeExtensions.GetCustomAttributes(this Assembly, Type) in .Net Core returns IEnumerable<Attribute>.

Sie müssen also Ihren Code entsprechend ändern. Der einfachste Weg wäre, .ToArray<object>() zu verwenden, aber eine bessere Lösung könnte darin bestehen, Ihren Code so zu ändern, dass er mit IEnumerable<Attribute> funktionieren kann.

+0

Sie haben auf jeden Fall etwas Licht in die Situation gebracht. Ich habe mehr Code hinzugefügt, mit dem ich arbeite, in der Hoffnung, zusätzliche Anleitungen zu erhalten. – PirateJubber

+0

@PirateJubber Hinzugefügt. – svick

5

Dies funktioniert für mich in .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": { } 
    } 
} 
+0

Ich habe es versäumt, die ganze Situation zu teilen, was ich versucht habe zu tun, aber Sie haben Recht, Ihre Lösung behebt den Fehler. Gibt es eine Möglichkeit, es zu überarbeiten, um mit Objekt [] zu arbeiten? – PirateJubber

3

Dies funktioniert für mich:

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

    return attributes?.Title; 
} 
0

Dies ist, was ich benutze:

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