Necesito para tener acceso a la asamblea de mi proyecto en C# .NET2.0.

Puedo ver el GUID en la Asamblea de la Información » de diálogo en virtud de las propiedades del proyecto, y por el momento sólo he copiado a una constante en el código. El GUID nunca va a cambiar, así que no es mala solución, pero sería agradable para acceder a él directamente. Es allí una manera de hacer esto?

  • Por favor, considere la posibilidad de cambiar su respuesta, la que has seleccionado es engañosa (incluso con editar los comentarios).
InformationsquelleAutor Nathan | 2009-02-02

7 Comentarios

  1. 64

    Tratar el siguiente código. El valor que se busca es almacenado en un GuidAttribute de instancia que se 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);
    }
    • cómo sobre el uso de ‘dominio de aplicación.CurrentDomain.DomainManager.EntryAssembly’ en lugar de ‘typeof(Programa).Asamblea’? así, podríamos cambiar el nombre de clase, ¿no?
    • Para salvar a otra persona de unos segundos de búsqueda en Google, GuidAttribute es en el espacio de nombres del Sistema.En tiempo de ejecución.InteropServices.
    • es tu amigo
  2. 32

    Editar: Para aquellos que insisten en downvoting… no puede borrar esta respuesta porque es la versión aceptada. Por lo tanto, estoy editando para incluir la respuesta correcta (JaredPar del código abajo)

    Bastante Simple si sólo desea obtener la Ejecución de la asamblea:

    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;
    • Esto le dará el Sistema.Reflexión.Tipo de montaje de la GUID, no su [assembly: Guid(….)]. Él está buscando la GuidAttribute de su asamblea. amazedsaint y JaredPar las respuestas la respuesta correcta.
    • Probablemente no hay necesidad de crear su propio atributo Guid cuando ya existe uno para la asamblea. Creo que Nathan acordado de forma retrospectiva así, dado que él seleccionó este como la respuesta..
    • Estoy bastante tarde a este partido, pero voy a segundo @Yoopergeek aquí. Pasé ~30 minutos utilizando este código en una unidad de prueba antes de comprender lo que se dijo y las ramificaciones de la misma. Esta es una realidad engañosa respuesta.
    • Esto podría ser eliminados ahora
  3. 9

    Otra manera es usar El mariscal.GetTypeLibGuidForAssembly.

    De acuerdo a msdn:

    Cuando las asambleas se exportan a tipo de bibliotecas, la biblioteca de tipo se le asigna un LIBID. Puede establecer la LIBID explícitamente mediante la aplicación del Sistema.En tiempo de ejecución.InteropServices.GuidAttribute en el ámbito de la asamblea, o puede ser generado de forma automática. El Tlbimp.exe (Tipo de Importador de la Biblioteca) de la herramienta calcula un LIBID valor basado en la identidad de la asamblea. GetTypeLibGuid devuelve el LIBID que se asocia con la GuidAttribute, si se aplica el atributo. De lo contrario, GetTypeLibGuidForAssembly devuelve el valor calculado. Como alternativa, puede utilizar la GetTypeLibGuid método para extraer el real LIBID a partir de una biblioteca de tipo.

    • Yo era capaz de hacer esto en F#, parece que la asamblea no tiene un atributo personalizado con el Guid
    • Este método funciona incluso con Assembly.ReflectionOnlyLoad y aun cuando dependiente de las asambleas no están cargados.
    • Así, el código completo es: System.Runtime.InteropServices.Marshal.GetTypeLibGuidForAssembly(System.Reflection.Assembly.GetExecutingAssembly()).ToString(). Se ve mucho más simple que con el otro método. Hay inconvenientes?
  4. 6

    Usted debería ser capaz de leer el atributo Guid de la asamblea a través de la reflexión. De esta manera se consigue el GUID de la actual asamblea

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

    Puede reemplazar el GuidAttribute con otros atributos, si quieres leer cosas como AssemblyTitle, AssemblyVersion etc

    También puede cargar otra asamblea (Asamblea.LoadFrom y todo) en lugar de llegar a la actual asamblea – si usted necesita leer estos atributos de ensamblados externos (por ejemplo, al cargar un plugin)

    • Por favor, no use «como» moldes si usted va a utilizar el resultado de la fundición de no importa qué. Es generalmente mal estilo debido a que usted obtenga una excepción NullReferenceException en lugar de la más informativa InvalidCastException si la conversión falla. «como» modelos son para cuando no sabes si el objeto es del tipo dado y sólo desea utilizar en caso de que lo es. Sólo tiene que utilizar un directo ((GuidAttribute)attribs[0]).Valor en lugar de eso si no esperes que sea de otro tipo (que no debería)
  5. 5

    En caso de que alguien más está buscando una salida del cuadro de ejemplo de trabajo, esto es lo que terminó con base en las respuestas anteriores.

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

    Actualización:

    Debido a que ha recibido un poco de atención decidí incluir otra forma de hacerlo he estado usando. De esta manera permite el uso de 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();
            }
        }
  6. 2

    Para obtener el appID se puede utilizar la siguiente línea de código:

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

    Para ello es necesario incluir el System.Runtime.InteropServices;

  7. 2

    O, igual de fácil:

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

    Me funciona…

Dejar respuesta

Please enter your comment!
Please enter your name here