Comment obtenir par programme le GUID d'une application dans .net2.0

100

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 'Assembly Information' sous les propriétés du projet, et pour le moment, je viens de le copier dans un const dans le code. Le GUID ne changera jamais, donc ce n'est pas une mauvaise solution, mais ce serait bien d'y accéder directement. Y a-t-il un moyen de faire cela?

Nathan
la source

Réponses:

152

Essayez le code suivant. La valeur que vous recherchez est stockée sur une instance 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);
}
JaredPar
la source
4
que diriez-vous d'utiliser 'AppDomain.CurrentDomain.DomainManager.EntryAssembly' au lieu de 'typeof (Program) .Assembly'? Eh bien, nous pourrions changer le nom de la classe Program, n'est-ce pas?
Kenial
11
Pour sauver quelqu'un d'autre quelques secondes de recherche sur Google, GuidAttribute se trouve dans l'espace de noms System.Runtime.InteropServices.
Bryce Wagner
5
@BryceWagner ctrl+.est votre ami
maxp
@Kenial je reçois System.AppDomain.DomainManager.get returned null.pour une application console simple. On dirait que Assembly.GetEntryAssembly()c'est le moyen préféré.
Jesse C. Slicer le
11

Une autre façon consiste à utiliser Marshal.GetTypeLibGuidForAssembly .

Selon msdn:

Lorsque les assemblys sont exportés vers des bibliothèques de types, la bibliothèque de types reçoit un LIBID. Vous pouvez définir le LIBID explicitement en appliquant le System.Runtime.InteropServices.GuidAttribute au niveau de l'assembly, ou il peut être généré 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é à 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.

andrey.ko
la source
J'ai pu le faire en F #, il semble que l'assemblage n'ait pas d'attribut personnalisé avec le Guid
fableal
Cette méthode fonctionne même avec Assembly.ReflectionOnlyLoadet même lorsque les assemblys dépendants ne sont pas chargés.
Martin Lottering
Ainsi, le code complet est: System.Runtime.InteropServices.Marshal.GetTypeLibGuidForAssembly(System.Reflection.Assembly.GetExecutingAssembly()).ToString(). Cela semble beaucoup plus simple que l'autre méthode. Y a-t-il des inconvénients?
utilisateur
7

Ou, tout aussi simple:

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

Travaille pour moi...


la source
6

Vous devriez pouvoir lire l'attribut Guid de l'assembly via la réflexion. Cela obtiendra le GUID de 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 GuidAttribute par d'autres attributs, si vous souhaitez lire des éléments tels que AssemblyTitle, AssemblyVersion, etc.

Vous pouvez également charger un autre assembly (Assembly.LoadFrom et tout) au lieu d'obtenir l'assembly actuel - si vous avez besoin de lire ces attributs d'assemblys externes (par exemple - lors du chargement d'un plugin)

stupéfaction
la source
6
Veuillez ne pas utiliser de lancers «comme» si vous comptez utiliser le résultat du casting quoi qu'il arrive. C'est généralement un mauvais style car vous obtenez une exception NullReferenceException au lieu de l'exception InvalidCastException plus informative si la conversion échoue. Les casts "as" sont faits pour quand vous ne savez pas si l'objet est du type donné et que vous ne voulez l'utiliser que si c'est le cas. Utilisez simplement un attribut direct ((GuidAttribute) [0]). Valeur à la place si vous ne vous attendez pas à ce qu'il soit d'un autre type (ce qu'il ne devrait pas)
poizan42
5

Au cas où quelqu'un d'autre chercherait un exemple de travail prêt à l'emploi, c'est ce que j'ai fini par utiliser 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. Cette façon vous permet de l'utiliser à partir d'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();
        }
    }
Scott Solmer
la source
1

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;

drgmak
la source
1

Pas de chance ici avec les autres réponses, mais j'ai réussi à résoudre le problème avec cette belle doublure:

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

J'espère que cela t'aides!

0tombo0
la source