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?

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);
}

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.


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


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)


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();
        }
    }

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;


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!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.