web-dev-qa-db-fra.com

Comment puis-je obtenir par programme le GUID d'une application en .net2.0

J'ai besoin d'accéder à l'assembly de mon projet en C # .NET2.0. 

Je peux voir le GUID dans la boîte de dialogue "Informations sur l'assemblage" dans les propriétés du projet et, pour le moment, je viens de le copier dans un code const. Le GUID ne changera jamais, ce n’est donc pas une si mauvaise solution, mais il serait agréable d’y accéder directement. Y a-t-il un moyen de faire cela?

40
Nathan

Essayez le code suivant. La valeur que vous recherchez est stockée sur une instance de GuidAttribute attachée à l’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);
}
61
JaredPar

Edit: Pour ceux qui persistent à voter ... Impossible de supprimer cette réponse car il s'agit de la version acceptée. Par conséquent, je modifie pour inclure la réponse correcte ( code de JaredPar ci-dessous)

Assez simple si vous voulez seulement obtenir l'assemblage en cours d'exécution:

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

Une autre méthode consiste à utiliser Marshal.GetTypeLibGuidForAssembly .

Selon msdn:

Lorsque les assemblys sont exportés vers des bibliothèques de types, un LIBID est attribué à la bibliothèque de types. Vous pouvez définir explicitement le LIBID en appliquant le paramètre System.Runtime.InteropServices.GuidAttribute au niveau de l’assemblage ou le générer automatiquement. L'outil Tlbimp.exe (Type Library Importer) calcule une valeur LIBID en fonction de l'identité de l'assembly. GetTypeLibGuid renvoie le LIBID associé au GuidAttribute, si l'attribut est appliqué. Sinon, GetTypeLibGuidForAssembly renvoie la valeur calculée. Vous pouvez également utiliser la méthode GetTypeLibGuid pour extraire le LIBID réel d'une bibliothèque de types existante.

9
andrey.ko

Vous devriez être capable de lire l'attribut Guid de l'Assemblée par réflexion. Ceci obtiendra le GUID pour l'assembly actuel

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

Vous pouvez également remplacer le GuidAttribute par d'autres attributs, si vous souhaitez lire des choses comme AssemblyTitle, AssemblyVersion, etc. 

Vous pouvez également charger un autre assemblage (Assembly.LoadFrom and all) au lieu de récupérer l'assembly actuel - si vous devez lire ces attributs d'assemblages externes (par exemple, lors du chargement d'un plugin)

6
amazedsaint

Si quelqu'un d'autre cherche un exemple de travail prêt à l'emploi, voici ce que j'ai finalement utilisé en fonction des réponses précédentes.

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

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

Mettre à jour:

Comme cela a attiré un peu d'attention, j'ai décidé d'inclure une autre façon de le faire que j'utilise. Cela vous permet de l'utiliser depuis une classe statique:

    /// <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

Ou, tout aussi facile:

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

Travaille pour moi...

1
user3089358

Pour obtenir l'appID, vous pouvez utiliser la ligne de code suivante:

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

Pour cela, vous devez inclure le System.Runtime.InteropServices;

0
drgmak