Подтвердить что ты не робот

Как программно получить GUID приложения в .net2.0

Мне нужно получить доступ к сборке моего проекта в С#.NET2.0.

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

4b9b3361

Ответ 1

Попробуйте использовать следующий код. Значение, которое вы ищете, хранится на экземпляре 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);
}

Ответ 2

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

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

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

Ответ 3

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

Согласно msdn:

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

Ответ 4

Вы должны уметь читать атрибут 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

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

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

Ответ 6

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

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

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