it-swarm.com.de

Wie bekomme ich programmgesteuert die GUID einer Anwendung in .net2.0

Ich muss auf die Assembly meines Projekts in C # .NET 2.0 zugreifen. 

Ich kann die GUID im Dialog 'Assembly Information' in den Projekteigenschaften sehen, und im Moment habe ich sie gerade in eine const im Code kopiert. Die GUID wird sich niemals ändern, daher ist dies keine schlechte Lösung, aber es wäre schön, direkt darauf zuzugreifen. Gibt es eine Möglichkeit, dies zu tun?

40
Nathan

Versuchen Sie den folgenden Code. Der Wert, nach dem Sie suchen, wird in einer der Assembly angefügten GuidAttribute-Instanz gespeichert

using System.Runtime.InteropServices;

static void Main(string[] args)
{
    var Assembly = typeof(Program).Assembly;
    var attribute = (GuidAttribute)Assembly.GetCustomAttributes(typeof(GuidAttribute),true)[0];
    var id = attribute.Value;
    Console.WriteLine(id);
}
61
JaredPar

Bearbeiten: An diejenigen, die auf Downvoting bestehen ... Diese Antwort kann nicht gelöscht werden, da es sich um die akzeptierte Version handelt. Deshalb sollte ich die richtige Antwort eingeben ( JaredPars Code unten)

Einfach genug, wenn Sie nur die ausführende Baugruppe erhalten möchten:

using System.Reflection;

Assembly assembly = Assembly.GetExecutingAssembly();

//The following line (part of the original answer) is misleading.
//**Do not** use it unless you want to return the System.Reflection.Assembly type's GUID.
Console.WriteLine(Assembly.GetType().GUID.ToString());


// The following is the correct code.
var attribute = (GuidAttribute)Assembly.GetCustomAttributes(typeof(GuidAttribute),true)[0];
var id = attribute.Value;
31
Cerebrus

Eine andere Möglichkeit ist die Verwendung von Marshal.GetTypeLibGuidForAssembly .

Laut msdn:

Wenn Baugruppen in Typbibliotheken exportiert werden, wird der Typbibliothek eine LIBID zugewiesen. Sie können die LIBID explizit festlegen, indem Sie System.Runtime.InteropServices.GuidAttribute auf Assembly-Ebene anwenden, oder es kann automatisch generiert werden. Das Tool Tlbimp.exe (Type Library Importer) berechnet einen LIBID-Wert basierend auf der Identität der Assembly. GetTypeLibGuid gibt die LIBID zurück, die dem GuidAttribute zugeordnet ist, wenn das Attribut angewendet wird. Andernfalls gibt GetTypeLibGuidForAssembly den berechneten Wert zurück. Alternativ können Sie die GetTypeLibGuid-Methode verwenden, um die tatsächliche LIBID aus einer vorhandenen Typbibliothek zu extrahieren.

9
andrey.ko

Sie sollten in der Lage sein, das Guid-Attribut der Assembly durch Reflektion zu lesen. Dadurch wird die GUID für die aktuelle Assembly abgerufen

         Assembly asm = Assembly.GetExecutingAssembly();
        var attribs = (asm.GetCustomAttributes(typeof(GuidAttribute), true));
        Console.WriteLine((attribs[0] as GuidAttribute).Value);

Sie können das GuidAttribute auch durch andere Attribute ersetzen, wenn Sie beispielsweise AssemblyTitle, AssemblyVersion usw. lesen möchten 

Sie können auch eine andere Assembly laden (Assembly.LoadFrom und alle), anstatt die aktuelle Assembly abzurufen - wenn Sie diese Attribute externer Assemblys lesen möchten (z. B. beim Laden eines Plugins).

6
amazedsaint

Für den Fall, dass jemand anderes nach einem Standardbeispiel sucht, habe ich dieses Ergebnis anhand der vorherigen Antworten verwendet.

using System.Reflection;
using System.Runtime.InteropServices;

label1.Text = "GUID: " + ((GuidAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(GuidAttribute), false)).Value.ToUpper();

Aktualisieren:

Da dies ein wenig Aufmerksamkeit erregt hat, habe ich mich dazu entschlossen, eine andere Möglichkeit zu verwenden, die ich verwendet habe. Auf diese Weise können Sie es von einer statischen Klasse aus verwenden:

    /// <summary>
    /// public GUID property for use in static class </summary>
    /// <returns> 
    /// Returns the application GUID or "" if unable to get it. </returns>
    static public string AssemblyGuid
    {
        get
        {
            object[] attributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(GuidAttribute), false);
            if (attributes.Length == 0) { return String.Empty; }
            return ((System.Runtime.InteropServices.GuidAttribute)attributes[0]).Value.ToUpper();
        }
    }
5
Okuma.Scott

Oder genauso einfach:

string assyGuid = Assembly.GetExecutingAssembly().GetCustomAttribute<GuidAttribute>().Value.ToUpper();

Funktioniert bei mir...

1
user3089358

Um die appID zu erhalten, können Sie die folgende Codezeile verwenden:

var applicationId = ((GuidAttribute)typeof(Program).Assembly.GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value;

Dazu müssen Sie den System.Runtime.InteropServices; angeben.

0
drgmak