Pergunta

Eu quero render (para interna depuração / info) a data da última modificação de uma montagem, então eu vou saber quando um determinado site foi implantado.

É possível obtê-lo através da reflexão?

Eu obter a versão como esta:

Assembly.GetExecutingAssembly().GetName().Version.ToString();

Eu estou procurando algo semelhante - Eu não quero abrir o arquivo físico, obter suas propriedades, ou algo assim, como eu vou ser tornando-o na página mestra, e não quer que tipo de sobrecarga.

Foi útil?

Solução

Eu vou segunda resposta de pYrania:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location);
DateTime lastModified = fileInfo.LastWriteTime;

Mas acrescentar o seguinte:

Você menciona que você não quer para acessar o sistema de arquivos, uma vez que está em sua página principal e você não quer fazer essa hit sistema de arquivo extra para cada página. Portanto, não, apenas acessá-lo uma vez no evento de carregamento de aplicativos e, em seguida, armazená-lo como uma variável de nível de aplicativo.

Outras dicas

Se você padrão os números de revisão e construir em AssemblyInfo:

[assembly: AssemblyVersion("1.0.*")]

Você pode obter a data de construção aproximada com:

Version version = typeof(MyType).Assembly.GetName().Version;
DateTime date = new DateTime(2000, 1, 1)
    .AddDays(version.Build)
    .AddSeconds(version.Revision * 2);

Como sobre isso?

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location);
DateTime lastModified = fileInfo.LastWriteTime;

Algumas pessoas pensam que Assembleia não possui data de construção, mas você sabe o que eles estão errados, você pode ser recuperar o timestamp vinculador do PE cabeçalho incorporado no arquivo executável, como a seguir pode trabalho (i havn't testado o código eu)

private DateTime RetrieveLinkerTimestamp()
{
    string filePath = System.Reflection.Assembly.GetCallingAssembly().Location;
    const int c_PeHeaderOffset = 60;
    const int c_LinkerTimestampOffset = 8;
    byte[] b = new byte[2048];
    System.IO.Stream s = null;

    try
    {
        s = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
        s.Read(b, 0, 2048);
    }
    finally
    {
        if (s != null)
        {
            s.Close();
        }
    }

    int i = System.BitConverter.ToInt32(b, c_PeHeaderOffset);
    int secondsSince1970 = System.BitConverter.ToInt32(b, i + c_LinkerTimestampOffset);
    DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0);
    dt = dt.AddSeconds(secondsSince1970);
    dt = dt.AddHours(TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours);
    return dt;
}

ou se a montagem é o seu seu próprio melhor você usar os seguintes simples abordagem e fácil

Adicionar abaixo para pré-build linha de comando evento:

echo %date% %time% > "$(ProjectDir)\Resources\BuildDate.txt"

Adicione esta arquivo como recurso, agora você tem string 'BuildDate' em seus recursos.

Tomei ambas as respostas de esta questão

A solução RetrieveLinkerTimestamp não irá funcionar após as dues ano 2038 ao uso de int32 de 1970. Eu sugiro usar o seguinte (embora isso provavelmente tem suas limitações também):

IO.File.GetLastWriteTime(Reflection.Assembly.GetExecutingAssembly().Location)

Eu não acredito que a montagem segura última informação modificado como que é um atributo do sistema operacional. Eu acredito que a única maneira de obter essas informações é através de um identificador de arquivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top