Como posso obter a versão do assembly em execução?

169

Estou tentando obter a versão do assembly em execução no C # 3.0 usando o seguinte código:

var assemblyFullName = Assembly.GetExecutingAssembly().FullName;
var version = assemblyFullName .Split(',')[1].Split('=')[1];

Existe outra maneira adequada de fazer isso?

user1
fonte

Respostas:

293

Duas opções ... independentemente do tipo de aplicativo, você sempre pode chamar:

Assembly.GetExecutingAssembly().GetName().Version

Se um aplicativo Windows Forms , você sempre pode acessar via aplicativo se procurar especificamente a versão do produto.

Application.ProductVersion

Usar GetExecutingAssemblypara uma referência de montagem nem sempre é uma opção. Como tal, eu pessoalmente acho útil criar uma classe auxiliar estática em projetos nos quais eu possa precisar fazer referência à montagem subjacente ou à versão da montagem:

// A sample assembly reference class that would exist in the `Core` project.
public static class CoreAssembly
{
    public static readonly Assembly Reference = typeof(CoreAssembly).Assembly;
    public static readonly Version Version = Reference.GetName().Version;
}

Depois, posso fazer uma referência limpa CoreAssembly.Versionno meu código, conforme necessário.

Chris Baxter
fonte
7
Se for implantado com ClickOnce, você precisa verificarSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion
Justin Morgan
O que seria interessante: onde você precisa especificar a versão real? I especificado o AssemblyVersion e AssemblyFileVersion em meus AssemblyInfo.cs e tudo o que começa a partir da chamada abovemethod é: 0.0.0.0 apesar de ter especificado 1.0.0
AgentKnopf
@Zainodis Se você estiver se referindo à ClickOnceversão mencionada por @Justin, ela será especificada na Publishguia dentro das propriedades do projeto (ou seja, não relacionada a AssemblyVersion ou AssemblyFileVersion).
Chris Baxter
@CalgaryCoder, obrigado pela resposta, não sei o que é o ClickOnce, mas acabou ao editar o arquivo AssemblyInfo via VS e, de repente, funcionou. A edição manual do AssemblyInfo.cas em um editor de texto fez com que todos os campos ficassem vazios. De qualquer maneira, ele é resolvido agora :)
AgentKnopf
7
Vale ressaltar que isso não funciona nos aplicativos ASP.NET MVC, devido ao contexto de inicialização. A solução é fazer referência a um tipo conhecido em seu site montagem, por exemplo, a MVC onipresente HomeController, por isso, Navalha:v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
James McCormack
38

No MSDN, o Assembly.GetExecutingAssembly Method , é uma observação sobre o método "getexecutingassembly", que por motivos de desempenho, você deve chamar esse método somente quando não souber em tempo de design o assembly que está sendo executado no momento.

A maneira recomendada de recuperar um objeto Assembly que representa o assembly atual é usar a Type.Assemblypropriedade de um tipo encontrado no assembly.

O exemplo a seguir ilustra:

using System;
using System.Reflection;

public class Example
{
    public static void Main()
    {
        Console.WriteLine("The version of the currently executing assembly is: {0}",
                          typeof(Example).Assembly.GetName().Version);
    }
}

/* This example produces output similar to the following:
   The version of the currently executing assembly is: 1.1.0.0

É claro que isso é muito semelhante à resposta da classe auxiliar "classe estática pública CoreAssembly", mas, se você conhece pelo menos um tipo de montagem em execução, não é obrigatório criar uma classe auxiliar e economiza seu tempo.

Sharunas Bielskis
fonte
19
using System.Reflection;
{
    string version = Assembly.GetEntryAssembly().GetName().Version.ToString();
}

Comentários do MSDN http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly%28v=vs.110%29.aspx :

O GetEntryAssemblymétodo pode retornar nullquando um assembly gerenciado for carregado a partir de um aplicativo não gerenciado. Por exemplo, se um aplicativo não gerenciado criar uma instância de um componente COM escrito em C #, uma chamada ao GetEntryAssemblymétodo do componente C # retornará null, porque o ponto de entrada do processo era um código não gerenciado, e não um assembly gerenciado.

Hammad Qureshi
fonte
2
+1. GetEntryAssembly(vs GetCallingAssemblyou GetExecutingAssembly) parece ser a única coisa que funciona quando chamada de dentro de uma biblioteca de referência.
Drzaus 29/05
6

Isso deve fazer:

Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName aName = assem.GetName();
return aName.Version.ToString();
Elroy Flynn
fonte
5
essas 3 linhas podem se tornar 1: retornar Assembly.GetExecutingAssembly (). GetName (). Version.ToString (); .............
Alexandre
1

Product Version pode ser preferido se você estiver usando controle de versão via GitVersion ou outro software de controle de versão.

Para obter isso na sua biblioteca de classes, você pode ligar para System.Diagnostics.FileVersionInfo.ProductVersion:

using System.Diagnostics;
using System.Reflection;

//...

var assemblyLocation = Assembly.GetExecutingAssembly().Location;
var productVersion = FileVersionInfo.GetVersionInfo(assemblyLocation).ProductVersion

insira a descrição da imagem aqui

Daniel
fonte