Як я можу програмно отримати GUID програми у .net2.0


100

Мені потрібно отримати доступ до складання мого проекту в C # .NET2.0.

Я можу побачити GUID у діалоговому вікні "Інформація про складання" в розділі "Властивості проекту", і наразі я лише скопіював його до const у коді. GUID ніколи не зміниться, тому це рішення не так вже й погано, але було б непогано отримати доступ до нього безпосередньо. Чи є спосіб це зробити?

Відповіді:


152

Спробуйте наступний код. Значення, яке ви шукаєте, зберігається в екземплярі GuidAttribute, приєднаному до асамблеї

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
як щодо використання "AppDomain.CurrentDomain.DomainManager.EntryAssembly" замість "typeof (Program) .Assembly"? ми можемо змінити назву класу Програма, чи не може?
Кеніал

11
Щоб зберегти когось ще на кілька секунд у Google, GuidAttribute знаходиться в просторі імен System.Runtime.InteropServices.
Брайс Вагнер

5
@BryceWagner ctrl+.є вашим другом
maxp

@Kenial Я отримую System.AppDomain.DomainManager.get returned null.просту консольну програму. Здається, Assembly.GetEntryAssembly()це кращий спосіб.
Джессі К. Слікер

11

Ще один спосіб - використовувати Marshal.GetTypeLibGuidForAssembly .

Згідно з повідомленням msdn:

Коли збірки експортуються до бібліотек типів, бібліотеці типів присвоюється LIBID. Ви можете встановити LIBID явно, застосувавши System.Runtime.InteropServices.GuidAttribute на рівні складання, або він може бути створений автоматично. Інструмент Tlbimp.exe (імпортер бібліотеки типів) обчислює значення LIBID на основі ідентичності збірки. GetTypeLibGuid повертає LIBID, пов'язаний з GuidAttribute, якщо атрибут застосований. В іншому випадку GetTypeLibGuidForAssembly повертає обчислене значення. Крім того, ви можете використовувати метод GetTypeLibGuid для отримання фактичного LIBID з існуючої бібліотеки типів.


Мені вдалося це зробити в F #, схоже, що в асамблеї немає спеціального атрибута з Guid
fableal

Цей метод працює навіть з Assembly.ReflectionOnlyLoadі навіть тоді, коли залежні збірки не завантажуються.
Мартін Лотрінг

Таким чином, повний код: System.Runtime.InteropServices.Marshal.GetTypeLibGuidForAssembly(System.Reflection.Assembly.GetExecutingAssembly()).ToString(). Виглядає набагато простіше, ніж інший метод. Чи є якісь недоліки?
користувач

7

Або так само просто:

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

Для мене працює ...


6

Ви повинні мати можливість прочитати атрибут Guid збірки за допомогою відображення. Це отримає GUID для поточної збірки

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

Ви також можете замінити GuidAttribute на інші атрибути, якщо ви хочете читати такі речі, як AssemblyTitle, AssemblyVersion тощо

Ви також можете завантажити іншу збірку (Assembly.LoadFrom та всі) замість отримання поточної збірки - якщо вам потрібно прочитати ці атрибути зовнішніх збірок (наприклад - під час завантаження плагіна)


6
Будь ласка, не використовуйте "як" касти, якщо ви збираєтесь використовувати результат акторів, незважаючи ні на що. Це, як правило, поганий стиль, тому що ви отримуєте NullReferenceException замість більш інформативної InvalidCastException, якщо виступ не вдається. "as" є для тих випадків, коли ви не знаєте, чи є об'єкт даного типу, і хочете використовувати його лише у випадку, якщо він є. Просто використовуйте пряме ((GuidAttribute) attribs [0]). Натомість значення, якщо ви не очікуєте, що воно буде іншого типу (чого воно не повинно)
poizan42

5

У випадку, якщо хтось інший шукає робочий приклад з коробки, це я закінчив, використовуючи попередні відповіді.

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

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

Оновлення:

Оскільки це привернуло трохи уваги, я вирішив включити інший спосіб робити це, яким я користувався. Цей спосіб дозволяє використовувати його зі статичного класу:

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

Щоб отримати додаток, ви можете використовувати такий рядок коду:

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

Для цього вам потрібно включити System.Runtime.InteropServices;


1

Не пощастило тут з іншими відповідями, але вдалося розібратися з цим гарним вкладишем:

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

Сподіваюся, це допомагає!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.