Как автоматически вставить дату сборки во время разработки - PullRequest
9 голосов
/ 15 декабря 2009

Надеюсь, полностью название было несколько описательным.

У меня есть приложение winform, написанное на C # с .net 2.0. Я хотел бы, чтобы последняя дата компиляции автоматически обновлялась до переменной для использования в окне about и initial splash box. В настоящее время у меня есть строковая переменная, которую я обновляю вручную. Есть ли способ сделать это?

VS2008 .net 2.0 с #

Ответы [ 5 ]

5 голосов
/ 15 декабря 2009

Еще одна хитрость (которую вы, возможно, не сможете использовать) - использовать числа автоматической сборки и ревизии, генерируемые .NET. Если ваш AssemblyInfo имеет:

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

Последние два числа - просто отметка даты / времени. Некоторый код (список ниже) может помочь:

Version v = Assembly.GetExecutingAssembly().GetName().Version;
DateTime compileDate = new DateTime((v.Build - 1) * TimeSpan.TicksPerDay + v.Revision * TimeSpan.TicksPerSecond * 2).AddYears(1999);

Изменить: вот альтернативный ответ, который может быть немного яснее, чем то, что я положил: https://stackoverflow.com/a/804895/2258

3 голосов
/ 15 декабря 2009

Вставьте это в ваши события перед сборкой;

echo public static class DateStamp { public readonly static System.DateTime BuildTime = System.DateTime.Parse("%date%"); }  > $(ProjectDir)DateStamp.cs

Создает класс с именем DateStamp, подобный этому;

public static class DateStamp
{ 
   public readonly static System.DateTime BuildTime = System.DateTime.Parse("14/12/2009"); 
}

И вы используете это так;

Console.WriteLine("Build on " + DateStamp.BuildTime.ToShortDateString());
1 голос
/ 22 июля 2017

Это может быть слишком поздно, чтобы быть полезным, но, возможно, это поможет кому-то еще.

Вы можете добавить эту цель в свой файл csproj, просто вставьте ее в конце:

 <Target Name="BuildDate" BeforeTargets="CoreCompile">
    <PropertyGroup>
      <SharedAssemblyInfoFile>$(IntermediateOutputPath)CustomAssemblyInfo.cs</SharedAssemblyInfoFile>
    </PropertyGroup>
    <ItemGroup>
      <Compile Include="$(SharedAssemblyInfoFile)" />
    </ItemGroup>
    <ItemGroup>
      <AssemblyAttributes Include="AssemblyMetadata">
        <_Parameter1>AssemblyDate</_Parameter1>
        <_Parameter2>$([System.DateTime]::UtcNow.ToString("u"))</_Parameter2>
      </AssemblyAttributes>
    </ItemGroup>
    <WriteCodeFragment Language="C#" OutputFile="$(SharedAssemblyInfoFile)" AssemblyAttributes="@(AssemblyAttributes)" />
  </Target>

Это создаст файл CustomAssemblyInfo.cs в папке «obj», содержащий одну строку: [assembly: AssemblyMetadata("AssemblyDate", "DATE_OF_BUILD_HERE")] Этот файл будет скомпилирован в вашу сборку, поэтому вы можете получить к нему доступ во время выполнения, используя отражение, например, с помощью следующего кода:

using System;
using System.Linq;
using System.Reflection;

public class Application
{
    static DateTime BuildDate;
    public static DateTime GetBuildDate()
    {
        if (BuildDate == default(DateTime)) {
            var attr = typeof(Application).Assembly.GetCustomAttributes<AssemblyMetadataAttribute>();
            var dateStr = attr.Single(a => a.Key == "AssemblyDate")?.Value;
            BuildDate = DateTime.Parse(dateStr);
        }
        return BuildDate;
    }
}

Стоит отметить, что используемый мной AssemblyMetadataAttribute был добавлен только в .NET 4.5.3, поэтому, если вам требуется поддержка версии, предшествующей этой, вы можете просто определить собственный тип настраиваемого атрибута для хранения даты. значение.

1 голос
/ 15 декабря 2009

Я использовал это о коробке с codeproject.com. На самом деле он был написан Джеффом Этвудом еще в 2004 году. Он вычисляет время компиляции, посмотрев на метку даты в файле сборки или рассчитав ее по версии сборки. Возможно, вы могли бы извлечь соответствующий код оттуда.

0 голосов
/ 15 декабря 2009

Нет встроенного макроса или подобного для этого. Лучшей ставкой может быть пользовательская задача сборки, например, на tigris , с использованием задачи Time и RegexReplace или аналогичной. Не просто, чтобы получить право. Лично я использую версию хранилища для обновления AssemblyInfo - в широком смысле?

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
...
<SvnInfo LocalPath=".">
  <Output TaskParameter="Revision" PropertyName="BuildRev" />
</SvnInfo>
<FileUpdate Files="protobuf-net\Properties\AssemblyInfo.cs"
        Regex='(\[\s*assembly:\s*AssemblyVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
        ReplacementText='$1.$2.$(BuildRev)$5' />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...