¿Cómo obtengo programáticamente el GUID de una aplicación en .net2.0?

100

Necesito acceder al ensamblaje de mi proyecto en C # .NET2.0.

Puedo ver el GUID en el cuadro de diálogo 'Información de ensamblaje' en las propiedades del proyecto, y en este momento lo acabo de copiar a una constante en el código. El GUID nunca cambiará, por lo que esta no es una mala solución, pero sería bueno acceder a él directamente. ¿Hay alguna forma de hacer esto?

Nathan
fuente

Respuestas:

152

Prueba el siguiente código. El valor que está buscando se almacena en una instancia de GuidAttribute adjunta a la Asamblea

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);
}
JaredPar
fuente
4
¿Qué tal usar 'AppDomain.CurrentDomain.DomainManager.EntryAssembly' en lugar de 'typeof (Program) .Assembly'? bueno, podríamos cambiar el nombre de la clase del programa, ¿no?
Kenial
11
Para ahorrarle a alguien más unos segundos de búsqueda en Google, GuidAttribute está en el espacio de nombres System.Runtime.InteropServices.
Bryce Wagner
5
@BryceWagner ctrl+.es tu amigo
maxp
@Kenial lo obtengo System.AppDomain.DomainManager.get returned null.por una aplicación de consola simple. Parece que Assembly.GetEntryAssembly()es la forma preferida.
Jesse C. Slicer
11

Otra forma es utilizar Marshal.GetTypeLibGuidForAssembly .

Según msdn:

Cuando los ensamblajes se exportan a bibliotecas de tipos, se asigna un LIBID a la biblioteca de tipos. Puede establecer el LIBID explícitamente aplicando System.Runtime.InteropServices.GuidAttribute en el nivel de ensamblado, o puede generarse automáticamente. La herramienta Tlbimp.exe (Importador de biblioteca de tipos) calcula un valor LIBID en función de la identidad del ensamblaje. GetTypeLibGuid devuelve el LIBID que está asociado con GuidAttribute, si se aplica el atributo. De lo contrario, GetTypeLibGuidForAssembly devuelve el valor calculado. Alternativamente, puede utilizar el método GetTypeLibGuid para extraer el LIBID real de una biblioteca de tipos existente.

andrey.ko
fuente
Pude hacer esto en F #, parece que el ensamblaje no tiene un atributo personalizado con el Guid
fábula
Este método funciona incluso con Assembly.ReflectionOnlyLoade incluso cuando no se cargan los ensamblados dependientes.
Martin Lottering
Por lo tanto, el código completo es: System.Runtime.InteropServices.Marshal.GetTypeLibGuidForAssembly(System.Reflection.Assembly.GetExecutingAssembly()).ToString(). Parece mucho más simple que el otro método. ¿Hay alguna desventaja?
usuario
7

O, igual de fácil:

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

Funciona para mi...


fuente
6

Debería poder leer el atributo Guid del ensamblaje mediante reflexión. Esto obtendrá el GUID para el ensamblado actual

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

También puede reemplazar el GuidAttribute con otros atributos, si desea leer cosas como AssemblyTitle, AssemblyVersion, etc.

También puede cargar otro ensamblado (Assembly.LoadFrom y todos) en lugar de obtener el ensamblado actual, si necesita leer estos atributos de ensamblajes externos (por ejemplo, al cargar un complemento)

asombrado
fuente
6
Por favor, no use "as" yesos si va a usar el resultado del yeso sin importar qué. En general, es de mal estilo porque obtiene una NullReferenceException en lugar de la InvalidCastException más informativa si la transmisión falla. Las conversiones "as" son para cuando no sabes si el objeto es del tipo dado y solo quieres usarlo en caso de que lo sea. Simplemente use un valor directo ((GuidAttribute) attribs [0]). En su lugar, si no espera que sea de otro tipo (que no debería)
poizan42
5

En caso de que alguien más esté buscando un ejemplo funcional listo para usar, esto es lo que terminé usando de acuerdo con las respuestas anteriores.

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

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

Actualizar:

Dado que esto ha recibido un poco de atención, decidí incluir otra forma de hacerlo que he estado usando. De esta forma te permite usarlo desde una clase estática:

    /// <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();
        }
    }
Scott Solmer
fuente
1

Para obtener el appID, puede usar la siguiente línea de código:

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

Para ello, debe incluir el System.Runtime.InteropServices;

drgmak
fuente
1

No tuve suerte aquí con las otras respuestas, pero logré resolverlo con este buen trazador de líneas:

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

¡Espero que esto ayude!

0tombo0
fuente