2009-12-14 2 views
9

Надеюсь, что заголовок был несколько очерченным.Как автоматически установить дату сборки, вставленную во время разработки

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

VS2008 .net 2.0 C#

ответ

5

Другим трюком (который вы не сможете использовать) является использование автоматических номеров сборки и ревизии, генерируемых .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); 

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

+1

Остерегайтесь! Этот код не работает, когда вы что-то создаете 11 марта 2012 года (из-за високосного года?): Он возвращается 12 марта, а не 11 марта. – JYL

0

Там нет встроенного макроса или аналогичного для этого. Лучшим вариантом может быть пользовательская задача сборки, например, на 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' /> 
+0

Я не согласен с этим подходом только потому, что считаю, что сборка не должна мутировать исходные файлы. – MarkPflug

1

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

2

Поп это в свои события, связанные с сборкой;

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()); 
+0

как его получить, чтобы распознать «DateStamp» перед сборкой? Я получаю сообщение об ошибке ... Имя «DateStamp» не существует в текущем контексте – Brad

+0

А, правильно. Файл (DateStamp.cs) будет находиться в корневой папке вашего проекта. В VS перейдите в проводник решений и нажмите кнопку, которая отображает все файлы, в том числе те, которые в настоящее время не включены в ваш проект. Найдите DateStamp.cs, щелкните его правой кнопкой мыши и выберите «включить в проект». Теперь вы должны найти его как часть своего проекта. –

1

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

Вы можете добавить эту цель в файл 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, поэтому, если вам нужно поддерживать предыдущую версию, вы можете просто определить свой собственный тип атрибута, чтобы сохранить значение даты.

Смежные вопросы