Como posso obter a versão do arquivo de montagem

727

No AssemblyInfoexistem duas versões de montagem:

  1. AssemblyVersion: Especifique a versão da montagem que está sendo atribuída.
  2. AssemblyFileVersion: Instrui um compilador a usar um número de versão específico para o recurso de versão do arquivo Win32. A versão do arquivo Win32 não precisa ser igual ao número da versão do assembly.

Eu posso obter Assembly Versiono seguinte com a seguinte linha de código:

Version version = Assembly.GetEntryAssembly().GetName().Version;

Mas como posso obter o Assembly File Version?

Enyra
fonte
2
O que você quer dizer com "versão do arquivo de montagem" em oposição a "versão da montagem"? Você pode dar um exemplo?
2626 Xiaofu
7
@Xiaofu - "Versão do Assembly" é o que o .NET usa internamente. "Versão do arquivo de montagem" é o que é exibido quando você clica com o botão direito do mouse em um arquivo e acessa "propriedades" e depois a guia "detalhes". Eles não são os mesmos.
precisa saber é
Descobri que a versão do assembly é usada para determinar o local user.config no AppData.
Kyle Delaney

Respostas:

867

Veja meu comentário acima, pedindo esclarecimentos sobre o que você realmente deseja. Espero que seja isso:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;
Xiaofu
fonte
4
@Xiaofu: Existe alguma maneira de obter os números de versão de um arquivo AssemblyInfo.cs?
Markus
56
Um problema com esse código é que ele realmente retornará 1.0. *. * Se você não especificou os números de compilação e revisão. AssemblyName.GetAssemblyName (assembly.Location) .Version.ToString (); você receberá o número da versão 'compilada' - que deve ser igual à FileVersion, se você estiver configurando as duas versões da mesma maneira.
Doguhan Uluca
17
@DoguhanUluca São duas coisas diferentes. Isso fornecerá a versão do assembly, não a versão do arquivo. "Se você estiver definindo as duas versões da mesma maneira" é uma solução alternativa, não uma solução.
Nyerguds
1
Possui FileVersionInfoapenas stringpropriedades e nenhuma Versionpropriedade?
Kyle Delaney
3
@ Yitzchak: Assembly.GetEntryAssembly()retorna NULL, por exemplo, no contexto de suplementos do Office e também em muitos outros casos. Além disso, se você pensa em suplementos / plugins - EntryAssembly é o aplicativo host e, na maioria das vezes, deseja a versão do YourCode (TM) :) Além disso, vale a pena adicionar a esta resposta que é assembly.Locationusada na resposta também pode ser nula. (ou seja, o primeiro caso aleatório pesquisado no Google: github.com/Azure/azure-functions-host/issues/1233 ) e isso provavelmente acontece com mais frequência do que ter montagem de entrada nula.
22418
209

Existem três versões : montagem , arquivo e produto . Eles são usados ​​por recursos diferentes e assumem valores padrão diferentes se você não os especificar explicitamente.

string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
string assemblyVersion = Assembly.LoadFile("your assembly file").GetName().Version.ToString(); 
string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; 
string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
Verificação6
fonte
17
Para quando esse post do blog desaparecer um dia, aqui está o resumo para referência: #string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString(); string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
1111 JMD
3
E para aqueles que desejam especificá-los no arquivo AssemblyInfo.cs, para assemblyVersion use (com os números desejados) === [assembly: AssemblyVersion("2.0.*")]para fileVersion use === [assembly: AssemblyFileVersion("2.0.*")]e para productVersion use === [assembly: AssemblyInformationalVersion("2.0.*")] O último pode ter o sufixo da string para SemVercompatibilidade:[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
Jesse Chisholm
Adendo: AssemblyFileVersionnão pode usar a *notação de sufixo. :( Ele precisa de todos os quatro números.[assembly: AssemblyFileVersion("2.0.0.1")]
Jesse Chisholm
66

Quando quiser acessar a versão do arquivo do aplicativo (o que é definido em Informações da montagem -> Versão do arquivo), diga para definir o texto de uma etiqueta no carregamento do formulário para exibir a versão, acabei de usar

versionlabel.Text = "Version " + Application.ProductVersion;
sintaxe
fonte
53
Observe que isso requer uma referência ao System.Windows.Forms e, portanto, pode não ser adequado para todos os aplicativos.
BradleyDotNET
2
Infelizmente, isso é uma string. Não é o ideal se você deseja formatá-lo para um tipo de formato "v1.08" mais simples. Muito mais prático se você realmente obtiver o objeto de versão para obter os subcomponentes como números inteiros.
Nyerguds
1
Além disso, isso seleciona AssemblyFileVersion de AssemblyInfo, não AssemblyVersion, então cuidado
dario_ramos
Um usuário de alta reputação poderia editar esta resposta para deixar mais claro que isso é apenas para Windows Forms?
Jrh 15/09
Era exatamente isso que eu procurava, obrigado pela resposta!
David Refoua
23

ATUALIZAÇÃO: Como mencionado por Richard Grimes no meu post citado , @Iain e @Dmitry Lobanov, minha resposta está certa na teoria, mas errada na prática.

Como eu deveria ter me lembrado de inúmeros livros etc., enquanto um define essas propriedades usando o [assembly: XXXAttribute], elas são atacadas pelo compilador e colocadas no VERSIONINFOrecurso.

Pelo motivo acima, você precisa usar a abordagem na resposta de @ Xiaofu, pois os atributos são removidos após a extração do sinal.


sequência estática pública GetProductVersion ()
{
  atributo var = Assembly (AssemblyVersionAttribute)
    .GetExecutingAssembly ()
    .GetCustomAttributes (typeof (AssemblyVersionAttribute), true)
    .Solteiro();
   return attribute.InformationalVersion;
}

(Em http://bytes.com/groups/net/420417-assemblyversionattribute - conforme observado lá, se você estiver procurando por um atributo diferente, substitua-o pelo descrito acima)

Ruben Bartelink
fonte
Hey Ruben, 2 notas. Primeiro, a pergunta feita por AssemblyFileVersion e não AssemblyVersion. Segundo, Assembly.GetExecutingAssembly (). GetCustomAttributes (typeof (AssemblyVersionAttribute), true) retorna uma matriz de comprimento 0. Acho que isso ocorre porque AssemblyVersionAttribute não é um atributo personalizado.
Iain
Quanto ao primeiro ponto, foi por isso que eu disse: "Se você procura um atributo diferente, substitua-o pelo descrito acima" (IIRC, eu não o experimentei). Re o segundo, que parece plausível, mas não tem tempo para cavar ...
Ruben Bartelink
Sim, você realmente não pode obter o atributo AssemblyVersion via .GetCustomAttribute (), a versão do assembly pode ser recuperada AssemblyName.Versionapenas pela propriedade Mas com cada outro atributo que é o caminho certo para fazê-lo
Dmitrii Lobanov
@DmitryLobanov e Iain Obrigado pelas instruções. Espero que a edição cubra o suficiente para fazer com que a resposta valha a pena ser mantida em vez de excluída - informe-me!
Ruben Bartelink
1
Eu usei em AssemblyInformationalVersionAttributevez de AssemblyVersionAttribute.net core 3.1
Vasya Milovidov 02/01
5

Usa isto:

((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
    Assembly.GetExecutingAssembly(), 
    typeof(AssemblyFileVersionAttribute), false)
).Version;

Ou isto:

new Version(System.Windows.Forms.Application.ProductVersion);
Pieter Geerkens
fonte