Jak programowo uzyskać identyfikator GUID aplikacji w .net2.0

100

Muszę uzyskać dostęp do zestawu mojego projektu w C # .NET2.0.

Widzę identyfikator GUID w oknie dialogowym „Informacje o zespole” we właściwościach projektu, aw tej chwili właśnie skopiowałem go do stałej w kodzie. GUID nigdy się nie zmieni, więc nie jest to takie złe rozwiązanie, ale dobrze byłoby uzyskać do niego bezpośredni dostęp. Czy jest na to sposób?

Nathan
źródło

Odpowiedzi:

152

Wypróbuj poniższy kod. Wartość, której szukasz, jest przechowywana w wystąpieniu GuidAttribute dołączonym do zestawu

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
źródło
4
co powiesz na użycie „AppDomain.CurrentDomain.DomainManager.EntryAssembly” zamiast „typeof (Program) .Assembly”? cóż, moglibyśmy zmienić nazwę klasy programu, prawda?
Kenial
11
Aby zaoszczędzić komuś innemu kilka sekund Google, GuidAttribute znajduje się w przestrzeni nazw System.Runtime.InteropServices.
Bryce Wagner
5
@BryceWagner ctrl+.jest twoim przyjacielem
maxp
@Kenial otrzymuję System.AppDomain.DomainManager.get returned null.za prostą aplikację konsolową. Wydaje się, że Assembly.GetEntryAssembly()jest to preferowany sposób.
Jesse C. Slicer
11

Innym sposobem jest użycie Marshal.GetTypeLibGuidForAssembly .

Według MSDN:

Gdy zestawy są eksportowane do bibliotek typów, do biblioteki typów jest przypisywany LIBID. LIBID można ustawić jawnie, stosując atrybut System.Runtime.InteropServices.GuidAttribute na poziomie zestawu lub można go wygenerować automatycznie. Narzędzie Tlbimp.exe (importer biblioteki typów) oblicza wartość LIBID na podstawie tożsamości zestawu. GetTypeLibGuid zwraca LIBID, który jest powiązany z GuidAttribute, jeśli atrybut jest stosowany. W przeciwnym razie GetTypeLibGuidForAssembly zwraca obliczoną wartość. Alternatywnie można użyć metody GetTypeLibGuid, aby wyodrębnić rzeczywisty LIBID z istniejącej biblioteki typów.

andrey.ko
źródło
Udało mi się to zrobić w F #, wygląda na to, że zespół nie ma niestandardowego atrybutu z
Guid
Ta metoda działa nawet w Assembly.ReflectionOnlyLoadprzypadku, gdy zestawy zależne nie są ładowane.
Martin Lottering
Tak, pełny kod jest: System.Runtime.InteropServices.Marshal.GetTypeLibGuidForAssembly(System.Reflection.Assembly.GetExecutingAssembly()).ToString(). Wygląda na znacznie prostszą niż inna metoda. Czy są jakieś wady?
użytkownik
7

Lub równie proste:

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

Pracuje dla mnie...


źródło
6

Powinno być możliwe odczytanie atrybutu Guid zestawu za pośrednictwem odbicia. Spowoduje to pobranie identyfikatora GUID dla bieżącego zestawu

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

Możesz zastąpić GuidAttribute innymi atrybutami, jeśli chcesz czytać takie rzeczy, jak AssemblyTitle, AssemblyVersion itp.

Możesz także załadować inny zestaw (Assembly.LoadFrom i all) zamiast pobierania bieżącego zestawu - jeśli chcesz odczytać te atrybuty zestawów zewnętrznych (np. - podczas ładowania wtyczki)

zdumiony
źródło
6
Nie używaj rzutów „as”, jeśli zamierzasz użyć wyniku rzucania bez względu na wszystko. Jest to ogólnie zły styl, ponieważ otrzymujesz NullReferenceException zamiast bardziej informacyjnego InvalidCastException, jeśli rzutowanie nie powiedzie się. Rzuty „as” są używane, gdy nie wiesz, czy obiekt jest danego typu i chcesz go użyć tylko w przypadku, gdy tak jest. Po prostu użyj bezpośredniego ((GuidAttribute) atrybuty [0]). Zamiast tego wartość, jeśli nie oczekujesz, że będzie innego typu (a nie powinien)
poizan42
5

Na wypadek, gdyby ktoś inny szukał nieszablonowego działającego przykładu, właśnie tego użyłem na podstawie poprzednich odpowiedzi.

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

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

Aktualizacja:

Ponieważ zwróciło to trochę uwagi, postanowiłem uwzględnić inny sposób robienia tego, którego używam. W ten sposób możesz używać go z klasy statycznej:

    /// <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
źródło
1

Aby uzyskać identyfikator aplikacji, możesz użyć następującego wiersza kodu:

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

W tym celu musisz dołączyć rozszerzenie System.Runtime.InteropServices;

drgmak
źródło
1

Nie ma tu szczęścia z innymi odpowiedziami, ale udało mi się to rozwiązać z tą ładną jedną linijką:

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

Mam nadzieję że to pomoże!

0tombo0
źródło