Atualmente, tenho um aplicativo exibindo o número da compilação em sua janela de título. Isso é bom, exceto que isso não significa nada para a maioria dos usuários, que querem saber se possuem a versão mais recente - eles tendem a se referir a ela como "da última quinta-feira" em vez da versão 1.0.8.4321.
O plano é colocar a data da compilação lá - então "Aplicativo criado em 21/10/2009", por exemplo.
Estou lutando para encontrar uma maneira programática de extrair a data de compilação como uma sequência de texto para uso como este.
Para o número da compilação, usei:
Assembly.GetExecutingAssembly().GetName().Version.ToString()
depois de definir como eles surgiram.
Eu gostaria de algo assim para a data de compilação (e hora, para pontos de bônus).
Os ponteiros aqui são muito apreciados (desculpe trocadilhos, se apropriado), ou soluções mais limpas ...
fonte
Respostas:
Jeff Atwood tinha algumas coisas a dizer sobre esse problema em Determinando a data da compilação da maneira mais difícil .
O método mais confiável é recuperar o registro de data e hora do vinculador do cabeçalho PE incorporado no arquivo executável - algum código C # (de Joe Spivey) para isso dos comentários ao artigo de Jeff:
Exemplo de uso:
ATUALIZAÇÃO: O método estava funcionando para o .Net Core 1.0, mas parou de funcionar após o lançamento do .Net Core 1.1 (fornece anos aleatórios no intervalo de 1900-2020)
fonte
.AddHours()
é bastante hackish e (acho) não levará em consideração o horário de verão. Se você quiser na hora local, use o limpadordt.ToLocalTime();
. A parte do meio também pode ser bastante simplificada com umusing()
bloco.Adicione abaixo à linha de comando do evento de pré-construção:
Adicione este arquivo como recurso, agora você tem a string 'BuildDate' em seus recursos.
Para criar recursos, consulte Como criar e usar recursos no .NET .
fonte
O caminho
Como apontado por @ c00000fd nos comentários . A Microsoft está mudando isso. E enquanto muitas pessoas não usam a versão mais recente de seu compilador, suspeito que essa mudança torne essa abordagem inquestionavelmente ruim. E, embora seja um exercício divertido, eu recomendaria que as pessoas simplesmente incorporassem uma data de construção em seu binário por qualquer outro meio necessário, se for importante rastrear a data de construção do próprio binário.
Isso pode ser feito com alguma geração trivial de código, que provavelmente já é a primeira etapa do seu script de construção. Isso e o fato de as ferramentas ALM / Build / DevOps ajudarem muito com isso e devem ser preferidas a qualquer outra coisa.
Deixo o restante desta resposta aqui apenas para fins históricos.
O novo caminho
Mudei de idéia sobre isso e, atualmente, use esse truque para obter a data de compilação correta.
O jeito antigo
Bem, como você gera números de compilação? O Visual Studio (ou o compilador C #) realmente fornece números de compilação e revisão automáticos se você alterar o atributo AssemblyVersion para, por exemplo,
1.0.*
O que acontecerá é que a compilação será igual ao número de dias desde 1º de janeiro de 2000, horário local, e a revisão será igual ao número de segundos desde o horário local da meia-noite, dividido por 2.
consulte Conteúdo da comunidade, números de compilação e revisão automáticos
por exemplo AssemblyInfo.cs
SampleCode.cs
fonte
TimeZone.CurrentTimeZone.IsDaylightSavingTime(buildDateTime) == true
IMAGE_FILE_HEADER::TimeDateStamp
campo é definido como um número aleatório e não é mais um carimbo de data / hora.Adicione abaixo à linha de comando do evento de pré-construção:
Adicione este arquivo como recurso, agora você tem a string 'BuildDate' em seus recursos.
Depois de inserir o arquivo no Recurso (como arquivo de texto público), acessei-o via
Para criar recursos, consulte Como criar e usar recursos no .NET .
fonte
Uma abordagem que me surpreende que ninguém tenha mencionado ainda é usar modelos de texto T4 para geração de código.
Prós:
Contras:
fonte
Constants.CompilationTimestampUtc
. Se o VS não estiver gerando um arquivo C # com a classe, você precisará descobrir como fazê-lo, mas a resposta depende (pelo menos) da versão do VS e do tipo de arquivo csproj, por isso é muitos detalhes para este post.Em relação à técnica de extrair informações de data / versão da compilação dos bytes de um cabeçalho PE do assembly, a Microsoft alterou os parâmetros de compilação padrão começando no Visual Studio 15.4. O novo padrão inclui compilação determinística, que torna um carimbo de data / hora válido e os números de versão incrementados automaticamente uma coisa do passado. O campo de registro de data e hora ainda está presente, mas é preenchido com um valor permanente que é um hash de uma coisa ou outra, mas não indica o tempo de construção.
Alguns antecedentes detalhados aqui
Para aqueles que priorizam um carimbo de data / hora útil sobre a compilação determinística, há uma maneira de substituir o novo padrão. Você pode incluir uma tag no arquivo .csproj do assembly de interesse da seguinte maneira:
Atualização: eu apoio a solução de modelo de texto T4 descrita em outra resposta aqui. Usei-o para resolver meu problema de maneira limpa, sem perder o benefício da compilação determinística. Um cuidado é que o Visual Studio só executa o compilador T4 quando o arquivo .tt é salvo, não no tempo de compilação. Isso pode ser estranho se você excluir o resultado .cs do controle de origem (já que você espera que seja gerado) e outro desenvolvedor verificar o código. Sem salvar novamente, eles não terão o arquivo .cs. Existe um pacote no nuget (eu acho chamado AutoT4) que faz a compilação do T4 parte de cada compilação. Ainda não enfrentei a solução para isso durante a implantação da produção, mas espero que algo semelhante o ajude.
fonte
Eu sou apenas novato em C #, talvez minha resposta pareça boba - eu exibo a data de compilação a partir da data em que o arquivo executável foi gravado pela última vez:
Tentei usar o método File.GetCreationTime, mas obtive resultados estranhos: a data do comando era 29/05/2012, mas a data do Windows Explorer mostrava 2012-05-23. Depois de procurar essa discrepância, descobri que o arquivo provavelmente foi criado em 23/05/2012 (como mostrado pelo Windows Explorer), mas copiado para a pasta atual em 29-05-2012 (como mostrado pelo comando File.GetCreationTime) - portanto para estar no lado seguro, estou usando o comando File.GetLastWriteTime.
Zalek
fonte
LastWriteTime
arquivo, pois isso reflete com precisão a hora em que o arquivo executável foi realmente atualizado.Muitas ótimas respostas aqui, mas acho que posso adicionar as minhas por causa da simplicidade, desempenho (em comparação com soluções relacionadas a recursos) entre plataformas (funciona também com o Net Core) e evita qualquer ferramenta de terceiros. Basta adicionar este destino msbuild ao csproj.
e agora você tem
Builtin.CompileTime
ounew DateTime(Builtin.CompileTime, DateTimeKind.Utc)
se precisar dessa maneira.ReSharper não vai gostar. Você pode ignorá-lo ou adicionar uma classe parcial ao projeto também, mas funciona assim mesmo.
fonte
Builtin.CompileTime
partir de uma visualização do Razor.BeforeTargets="RazorCoreCompile"
, mas somente enquanto este está no mesmo projetoPara projetos do .NET Core, adaptei a resposta do Postlagerkarte para atualizar o campo Copyright da montagem com a data da compilação.
Editar diretamente csproj
O seguinte pode ser adicionado diretamente ao primeiro
PropertyGroup
no csproj:Alternativa: Propriedades do Projeto Visual Studio
Ou cole a expressão interna diretamente no campo Copyright na seção Package das propriedades do projeto no Visual Studio:
Isso pode ser um pouco confuso, porque o Visual Studio avaliará a expressão e exibirá o valor atual na janela, mas também atualizará o arquivo do projeto adequadamente nos bastidores.
Em toda a solução via Directory.Build.props
Você pode colocar o
<Copyright>
elemento acima em umDirectory.Build.props
arquivo na raiz da solução e aplicá-lo automaticamente a todos os projetos no diretório, assumindo que cada projeto não forneça seu próprio valor de Copyright.Directory.Build.props: personalize sua compilação
Resultado
A expressão de exemplo fornecerá direitos autorais como este:
Recuperação
Você pode visualizar as informações de direitos autorais das propriedades do arquivo no Windows ou obtê-las em tempo de execução:
fonte
O método acima pode ser ajustado para montagens já carregadas no processo , usando a imagem do arquivo na memória (em vez de relê-lo do armazenamento):
fonte
Para quem precisa obter o tempo de compilação no Windows 8 / Windows Phone 8:
Para quem precisa obter o tempo de compilação no Windows Phone 7:
OBSERVAÇÃO: em todos os casos, você está executando em uma sandbox, para poder obter o tempo de compilação dos assemblies implantados com o aplicativo. (ou seja, isso não funcionará em nada no GAC).
fonte
var assembly = typeof (AnyTypeInYourAssembly).GetTypeInfo().Assembly;
Em 2018, algumas das soluções acima não funcionam mais ou não funcionam com o .NET Core.
Eu uso a seguinte abordagem, que é simples e funciona para o meu projeto .NET Core 2.0.
Adicione o seguinte ao seu .csproj dentro do PropertyGroup:
Isso define uma PropertyFunction que você pode acessar no seu comando de pré-construção.
Sua pré-construção se parece com isso
Defina a propriedade do BuildTimeStamp.txt como recurso incorporado.
Agora você pode ler o carimbo de hora como este
fonte
"$(ProjectDir)BuildTimeStamp.txt"
) ou ele será quebrado quando houver espaços nos nomes das pastas.$([System.DateTime]::Now.tostring("MM/dd/yyyy HH:mm:ss"))
vez de$([System.DateTime]::Now)
A opção não discutida aqui é inserir seus próprios dados no AssemblyInfo.cs, o campo "AssemblyInformationalVersion" parece apropriado - temos alguns projetos em que estávamos fazendo algo semelhante como uma etapa de construção (no entanto, não estou totalmente satisfeito com o maneira que funciona, então não quero realmente reproduzir o que temos).
Há um artigo sobre o assunto no codeproject: http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx
fonte
Eu precisava de uma solução universal que funcionasse com um projeto NETStandard em qualquer plataforma (iOS, Android e Windows.) Para fazer isso, decidi gerar automaticamente um arquivo CS por meio de um script do PowerShell. Aqui está o script do PowerShell:
Salve o arquivo do PowerScript como GenBuildDate.ps1 e adicione-o ao seu projeto. Por fim, adicione a seguinte linha ao seu evento Pre-Build:
Verifique se BuildDate.cs está incluído no seu projeto. Funciona como um campeão em qualquer sistema operacional!
fonte
Eu só faço:
fonte
Você pode usar este projeto: https://github.com/dwcullop/BuildInfo
Ele utiliza o T4 para automatizar o registro de data e hora da construção. Existem várias versões (ramificações diferentes), incluindo uma que fornece o Git Hash da ramificação com check-out atualmente, se você gosta desse tipo de coisa.
Divulgação: escrevi o módulo.
fonte
Uma abordagem diferente, compatível com PCL, seria usar uma tarefa embutida do MSBuild para substituir o tempo de compilação em uma sequência retornada por uma propriedade no aplicativo. Estamos usando essa abordagem com êxito em um aplicativo que possui projetos Xamarin.Forms, Xamarin.Android e Xamarin.iOS.
EDITAR:
Simplificado movendo toda a lógica para o
SetBuildDate.targets
arquivo e usando emRegex
vez de uma sequência simples, substitua para que o arquivo possa ser modificado por cada construção sem uma "redefinição".A definição de tarefa embutida do MSBuild (salva em um arquivo SetBuildDate.targets local no projeto Xamarin.Forms deste exemplo):
Chamando a tarefa embutida acima no arquivo Xamarin.Forms csproj no destino BeforeBuild:
A
FilePath
propriedade é configurada para umBuildMetadata.cs
arquivo no projeto Xamarin.Forms que contém uma classe simples com uma propriedade stringBuildDate
, na qual o tempo de compilação será substituído:Adicione este arquivo
BuildMetadata.cs
ao projeto. Ele será modificado a cada compilação, mas de uma maneira que permita compilações repetidas (substituições repetidas), para que você possa incluí-lo ou omiti-lo no controle de origem, conforme desejado.fonte
Você pode usar um evento de pós-construção do projeto para gravar um arquivo de texto no diretório de destino com a data e hora atuais. Você pode então ler o valor no tempo de execução. É um pouco hacky, mas deve funcionar.
fonte
Não tenho certeza, mas talvez o Build Incrementer ajude.
fonte
Uma pequena atualização sobre a resposta "New Way" de Jhon.
Você precisa criar o caminho em vez de usar a string CodeBase ao trabalhar com o ASP.NET/MVC
fonte
Você pode iniciar uma etapa extra no processo de criação que grava um carimbo de data em um arquivo que pode ser exibido.
Na guia de propriedades do projeto, observe a guia de eventos de construção. Existe uma opção para executar um comando de pré ou pós-compilação.
fonte
Eu usei a sugestão de Abdurrahim. No entanto, parecia dar um formato de horário estranho e também adicionou a abreviação do dia como parte da data de compilação; exemplo: dom 24/12/2017 13: 21: 05.43. Eu só precisava da data, então tive que eliminar o restante usando substring.
Depois de adicionar o
echo %date% %time% > "$(ProjectDir)\Resources\BuildDate.txt"
evento pré-compilação, fiz o seguinte:A boa notícia aqui é que funcionou.
fonte
Se esse for um aplicativo do Windows, você pode apenas usar o caminho executável do aplicativo: new System.IO.FileInfo (Application.ExecutablePath) .LastWriteTime.ToString ("aaaa.MM.dd")
fonte
Poderia ser
Assembly execAssembly = Assembly.GetExecutingAssembly(); var creationTime = new FileInfo(execAssembly.Location).CreationTime; // "2019-09-08T14:29:12.2286642-04:00"
fonte