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.