Come ottengo programmaticamente il GUID di un'applicazione in .net2.0


100

Ho bisogno di accedere all'assembly del mio progetto in C # .NET2.0.

Posso vedere il GUID nella finestra di dialogo "Informazioni sull'assembly" sotto le proprietà del progetto e al momento l'ho copiato in una const nel codice. Il GUID non cambierà mai, quindi questa non è una cattiva soluzione, ma sarebbe bello accedervi direttamente. C'è un modo per fare questo?

Risposte:


152

Prova il codice seguente. Il valore che stai cercando è archiviato in un'istanza GuidAttribute collegata all'assembly

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

4
che ne dici di usare "AppDomain.CurrentDomain.DomainManager.EntryAssembly" invece di "typeof (Program) .Assembly"? beh, potremmo cambiare il nome della classe del programma, no?
— Kenial

11
Per salvare qualcun altro alcuni secondi di ricerca su Google, GuidAttribute si trova nello spazio dei nomi System.Runtime.InteropServices.
— Bryce Wagner

5
@BryceWagner ctrl+.è tuo amico
— maxp

@Kenial ottengo System.AppDomain.DomainManager.get returned null.per una semplice app per console. Sembra che Assembly.GetEntryAssembly()sia il modo preferito.
— Jesse C. Slicer,

11

Un altro modo è usare Marshal.GetTypeLibGuidForAssembly .

Secondo msdn:

Quando gli assembly vengono esportati in librerie dei tipi, alla libreria dei tipi viene assegnato un LIBID. È possibile impostare il LIBID in modo esplicito applicando System.Runtime.InteropServices.GuidAttribute a livello di assembly oppure può essere generato automaticamente. Lo strumento Tlbimp.exe (Type Library Importer) calcola un valore LIBID in base all'identità dell'assembly. GetTypeLibGuid restituisce il LIBID associato a GuidAttribute, se l'attributo viene applicato. In caso contrario, GetTypeLibGuidForAssembly restituisce il valore calcolato. In alternativa, è possibile utilizzare il metodo GetTypeLibGuid per estrarre il LIBID effettivo da una libreria dei tipi esistente.


Sono stato in grado di farlo in F #, sembra che l'assembly non abbia un attributo personalizzato con il Guid
— favoloso

Questo metodo funziona anche con Assembly.ReflectionOnlyLoade anche quando gli assembly dipendenti non vengono caricati.
— Martin Lottering

Quindi, il codice completo è: System.Runtime.InteropServices.Marshal.GetTypeLibGuidForAssembly(System.Reflection.Assembly.GetExecutingAssembly()).ToString(). Sembra molto più semplice dell'altro metodo. Ci sono aspetti negativi?
— utente

7

Oppure, altrettanto facile:

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

Per me va bene...


6

Dovresti essere in grado di leggere l'attributo Guid dell'assembly tramite la riflessione. Ciò otterrà il GUID per l'assembly corrente

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

Puoi sostituire GuidAttribute anche con altri attributi, se vuoi leggere cose come AssemblyTitle, AssemblyVersion ecc.

È anche possibile caricare un altro assembly (Assembly.LoadFrom e tutto) invece di ottenere l'assembly corrente, se è necessario leggere questi attributi di assembly esterni (ad esempio, durante il caricamento di un plug-in)


6
Si prega di non utilizzare cast "as" se si intende utilizzare il risultato del cast, qualunque cosa accada. In genere è uno stile scadente perché si ottiene un'eccezione NullReferenceException invece della più informativa InvalidCastException se il cast non riesce. I cast "as" sono per quando non sai se l'oggetto è del tipo dato e vuoi usarlo solo nel caso in cui lo sia. Utilizza un valore diretto ((GuidAttribute) attribs [0]). Se non ti aspetti che sia di un altro tipo (cosa che non dovrebbe)
— poizan42

5

Nel caso in cui qualcun altro stia cercando un esempio funzionante fuori dagli schemi, questo è quello che ho finito per usare in base alle risposte precedenti.

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

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

Aggiornare:

Poiché questo ha ottenuto un po 'di attenzione, ho deciso di includere un altro modo di farlo che ho utilizzato. In questo modo puoi usarlo da una classe statica:

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

1

Per ottenere l'appID è possibile utilizzare la seguente riga di codice:

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

Per questo è necessario includere il file System.Runtime.InteropServices;


1

Nessuna fortuna qui con le altre risposte, ma sono riuscito a risolverlo con questo bel rivestimento:

((GuidAttribute)(AppDomain.CurrentDomain.DomainManager.EntryAssembly).GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value

Spero che questo ti aiuti!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.