Como obtenho programaticamente o GUID de um aplicativo em .net2.0

100

Preciso acessar a montagem do meu projeto em C # .NET2.0.

Posso ver o GUID na caixa de diálogo 'Informações do assembly' em propriedades do projeto e, no momento, acabei de copiá-lo para um const no código. O GUID nunca mudará, então esta não é uma solução ruim, mas seria bom acessá-lo diretamente. Existe uma maneira de fazer isso?

Nathan
fonte

Respostas:

152

Experimente o seguinte código. O valor que você está procurando é armazenado em uma instância GuidAttribute anexada ao Assembly

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);
}
JaredPar
fonte
4
que tal usar 'AppDomain.CurrentDomain.DomainManager.EntryAssembly' em vez de 'typeof (Program) .Assembly'? bem, poderíamos mudar o nome da classe do programa, não podemos?
Kenial,
11
Para poupar alguns segundos de pesquisa no Google, GuidAttribute está no namespace System.Runtime.InteropServices.
Bryce Wagner
5
@BryceWagner ctrl+.é seu amigo
maxp
Recebo @Kenial System.AppDomain.DomainManager.get returned null.por um aplicativo de console simples. Parece que Assembly.GetEntryAssembly()é a forma preferida.
Jesse C. Slicer
11

Outra maneira é usar Marshal.GetTypeLibGuidForAssembly .

De acordo com o msdn:

Quando os assemblies são exportados para bibliotecas de tipos, a biblioteca de tipos é atribuída a um LIBID. Você pode definir o LIBID explicitamente aplicando System.Runtime.InteropServices.GuidAttribute no nível do assembly ou ele pode ser gerado automaticamente. A ferramenta Tlbimp.exe (Type Library Importer) calcula um valor LIBID com base na identidade do assembly. GetTypeLibGuid retorna o LIBID que está associado ao GuidAttribute, se o atributo for aplicado. Caso contrário, GetTypeLibGuidForAssembly retorna o valor calculado. Como alternativa, você pode usar o método GetTypeLibGuid para extrair o LIBID real de uma biblioteca de tipos existente.

andrey.ko
fonte
Consegui fazer isso no F #, parece que a montagem não tem um atributo personalizado com o Guid
fableal
Este método funciona mesmo com Assembly.ReflectionOnlyLoade mesmo quando as montagens dependentes não são carregadas.
Martin Lottering
Assim, o código completo é: System.Runtime.InteropServices.Marshal.GetTypeLibGuidForAssembly(System.Reflection.Assembly.GetExecutingAssembly()).ToString(). Parece muito mais simples do que o outro método. Existem desvantagens?
usuário
7

Ou tão fácil:

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

Funciona para mim...


fonte
6

Você deve ser capaz de ler o atributo Guid da montagem por meio de reflexão. Isso obterá o GUID para a montagem atual

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

Você também pode substituir o GuidAttribute por outros atributos, se quiser ler coisas como AssemblyTitle, AssemblyVersion etc.

Você também pode carregar outro conjunto (Assembly.LoadFrom e todos) em vez de obter o conjunto atual - se você precisar ler esses atributos de conjuntos externos (por exemplo - ao carregar um plugin)

espantado
fonte
6
Por favor, não use "como" elenco se você for usar o resultado do elenco, não importa o quê. Geralmente é um estilo ruim porque você obtém uma NullReferenceException em vez da InvalidCastException mais informativa se a conversão falhar. Casts "as" são para quando você não sabe se o objeto é do tipo determinado e só deseja usá-lo caso seja. Basta usar um valor direto ((GuidAttribute) [0]). Em vez disso, se você não espera que seja de outro tipo (o que não deveria)
poizan42
5

Caso alguém esteja procurando por um exemplo funcional pronto para usar, acabei usando isso com base nas respostas anteriores.

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

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

Atualizar:

Como isso chamou um pouco de atenção, decidi incluir outra maneira de fazer isso que venho usando. Dessa forma, você pode usá-lo a partir de uma classe estática:

    /// <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();
        }
    }
Scott Solmer
fonte
1

Para obter o appID, você pode usar a seguinte linha de código:

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

Para isso, você precisa incluir o System.Runtime.InteropServices;

drgmak
fonte
1

Sem sorte aqui com as outras respostas, mas consegui resolver com este belo forro:

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

Espero que isto ajude!

0tombo0
fonte