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

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

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

7 ответов


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

Edit: для тех, кто настаивает на downvoting... Невозможно удалить этот ответ, поскольку он является принятой версией. Поэтому я редактирую, чтобы включить правильный ответ (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;

другой способ-использовать Маршал.GetTypeLibGuidForAssembly.

согласно msdn:

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


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


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

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

или просто:

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

работает для меня...


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

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

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