Как программно получить GUID приложения в .net2.0 - PullRequest
41 голосов
/ 02 февраля 2009

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

Я вижу GUID в диалоговом окне «Информация о сборке» в разделе свойств проекта, и в данный момент я только что скопировал его в const в коде. GUID никогда не изменится, так что это не так уж плохо для решения, но было бы неплохо получить к нему прямой доступ. Есть ли способ сделать это?

Ответы [ 7 ]

63 голосов
/ 02 февраля 2009

Попробуйте следующий код. Требуемое значение хранится в экземпляре 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);
}
32 голосов
/ 02 февраля 2009

Редактировать: Для тех, кто настаивает на голосовании ... Невозможно удалить этот ответ, потому что это принятая версия. Поэтому я редактирую, чтобы включить правильный ответ ( код JaredPar ниже)

Достаточно просто, если вы хотите получить только исполняющую сборку:

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;
9 голосов
/ 14 июля 2012

Другой способ - использовать Marshal.GetTypeLibGuidForAssembly .

Согласно MSDN:

Когда сборки экспортируются в библиотеки типов, библиотеке типов присваивается LIBID. Вы можете установить LIBID явным образом, применив атрибут System.Runtime.InteropServices.GuidAttribute на уровне сборки, или он может быть создан автоматически. Средство Tlbimp.exe (Импорт библиотеки типов) вычисляет значение LIBID на основе идентификатора сборки. GetTypeLibGuid возвращает LIBID, связанный с атрибутом GuidAttribute, если атрибут применяется. В противном случае GetTypeLibGuidForAssembly возвращает вычисленное значение. Кроме того, вы можете использовать метод GetTypeLibGuid для извлечения фактического LIBID из существующей библиотеки типов.

6 голосов
/ 02 февраля 2009

Вы должны быть в состоянии прочитать атрибут 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 и все) вместо получения текущей сборки - если вам нужно прочитать эти атрибуты внешних сборок (например, при загрузке плагина)

5 голосов
/ 20 декабря 2013

В случае, если кто-то еще ищет готовый рабочий пример, это то, чем я в конечном итоге воспользовался, основываясь на предыдущих ответах.

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 голос
/ 30 августа 2018

Или просто:

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

У меня работает ...

1 голос
/ 01 июня 2016

Чтобы получить идентификатор приложения, вы можете использовать следующую строку кода:

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

Для этого нужно включить System.Runtime.InteropServices;

...