C# 如何在设计时自动插入生成日期

C# 如何在设计时自动插入生成日期,c#,.net,winforms,C#,.net,Winforms,希望这个标题有点描述性 我有一个用C#和.NET2.0编写的winform应用程序。我想让最后一个编译日期自动更新为一个变量,以便在about框和initialsplash框中使用。目前我有一个手动更新的字符串变量。有没有办法做到这一点 VS2008 .NET2.0 c#没有内置宏或类似的宏。您的最佳选择可能是使用Time任务和RegexReplace或类似工具执行自定义构建任务,例如on。做对并不容易。就我个人而言,我使用存储库版本来更新AssemblyInfo-广泛相关 <Import

希望这个标题有点描述性

我有一个用C#和.NET2.0编写的winform应用程序。我想让最后一个编译日期自动更新为一个变量,以便在about框和initialsplash框中使用。目前我有一个手动更新的字符串变量。有没有办法做到这一点

VS2008 .NET2.0
c#

没有内置宏或类似的宏。您的最佳选择可能是使用
Time
任务和
RegexReplace
或类似工具执行自定义构建任务,例如on。做对并不容易。就我个人而言,我使用存储库版本来更新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' />

...
另一个技巧(您可能无法使用)是利用.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);
编辑:这里有一个比我说的更清楚的备选答案:

我从codeproject.com使用。它实际上是杰夫·阿特伍德在2004年写的。它通过查看程序集文件上的日期戳或根据程序集版本计算来计算编译时间。也许您可以从中提取相关代码。

将其弹出到预构建事件中

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());
你这样使用它

public static class DateStamp
{ 
   public readonly static System.DateTime BuildTime = System.DateTime.Parse("14/12/2009"); 
}
Console.WriteLine("Build on " + DateStamp.BuildTime.ToShortDateString());

这可能晚了十年才有用,但可能会帮助其他人

您可以将此目标添加到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>

需要注意的一点是,我在这里使用的AssemblyMetadataAttribute只是在.NET 4.5.3中添加的,因此如果您需要支持以前的版本,您只需定义自己的自定义属性类型来保存日期值。

如何让它在生成之前识别“DateStamp”?我得到了错误…名称“DateStamp”在当前上下文中不存在,对吗。文件(DateStamp.cs)将位于项目的根文件夹中。在VS中,转到解决方案资源管理器并单击显示所有文件的按钮,包括当前不在项目中的文件。找到DateStamp.cs,右键单击它,然后选择“包含在项目中”。你现在应该发现它是你项目的一部分。小心!当你在2012年3月11日构建某个东西时,这段代码不起作用(因为闰年?):它返回3月12日而不是3月11日。我不同意这种方法,只是因为我认为构建不应该改变源文件。这个解决方案很好。。。但我在一个传统的ASP.NET WebForms项目中使用它,它似乎破坏了“发布”构建(VS抱怨
AssemblyMetadataAttribute
缺少参数)-但奇怪的是,如果我先进行初始的常规项目构建,然后进行发布构建,它就可以工作了。wird.this get:System.invalidoOperationException:'序列不包含匹配元素'