在装配信息中动态显示当前年份

时间:2012-04-17 17:48:43

标签: c# vb.net

如何在AssemblyInfo文件中设置当前年份?

我用过

而不是:

<Assembly: AssemblyCopyright("Copyright 2012, Company Name.")> 

尝试了这个:

<Assembly: AssemblyCopyright("Copyright" + DateTime.Now.Year.ToString() + ", Company Name.")> 

我得到无效的常量错误。

我不想使用注册表项,这样做的最佳方法是什么? (这样,当用户右键单击EXE&amp;查找汇编信息时,可以看到当前年份。)

感谢。

6 个答案:

答案 0 :(得分:23)

我在其他帖子(https://stackoverflow.com/a/827209/857307)上看到了一些在这里真有帮助的内容。

试试这个。

将新文件添加到源存储库中,该解决方案中的所有项目都是通用的。调用类似AssemblyCopyright.tt

的文件

在文件中,为c#

添加以下代码
<#@ template language="C#" #>
using System;
using System.Reflection;

[assembly: AssemblyCopyright("Copyright © CompanyName <#=DateTime.Now.Year#>")]

或vb

<#@ template language="VB" #>
<#@ output extension=".vb" #>
Imports System
Imports System.Reflection

<Assembly: AssemblyCopyright("Copyright © CompanyName <#=DateTime.Now.Year#>")> 

然后,从每个AssemblyInfo.cs文件中删除AssemblyCopyright属性。

最后,将AssemblyCopyright.tt文件的链接添加到每个项目中。

模板文件将在每个构建时使用正确的年份重新创建一个新的AssemblyCopyright.cs文件。

答案 1 :(得分:1)

可能最好的方法是使用NAntMSBuild等工具将其整合到您的构建过程中。

这篇文章解释了如何使用MSBuild更改AssemblyInfo: 正在更新Assemblies with A Version Number

答案 2 :(得分:1)

您可以使用NANT / MSBuild任务来修改AssemblyInfo.cs文件,就像我们为每个构建更改每个程序集的版本一样。

有关详细信息,请访问http://msbuildtasks.tigris.org/

答案 3 :(得分:1)

通常,对于这种替换,您使用预构建步骤来调用自动生成assemblyInfo.cs文件的脚本。

您可以查看此主题:How can you find and replace text in a file using the Windows command-line environment?

答案 4 :(得分:0)

我有类似的问题,但对于新样式的csproj文件;包含文件版本信息。我在How to define current system date in post build event找到了一个很好的答案。奇怪的是,这是一个与我和OP问题有些不同的问题。但是,我认为对此的公认答案是我想要的。即,csproj文件中的$([System.DateTime] :: Now.Year)会计算为当年。

答案 5 :(得分:0)

试试这个:

<Assembly: AssemblyCopyright("Copyright $([System.DateTime]::Now.ToString('yyyy'), Company Name.")> 

我还没有完全尝试过。由于我使用 this answer 中所述的 WriteCodeFragment 通过 .csproj 定义了程序集信息的其他一些部分,因此我也是这样做的 - 我定义了属性

  <!-- We started in 2021.  So, if it's still 2021 we just want to show '2021' -->
  <PropertyGroup Condition="$([System.DateTime]::Now.ToString('yyyy')) == '2021'">
    <CopyrightYears>2021</CopyrightYears>
  </PropertyGroup>
  <!-- But for later years we want a range.  E.g. in 2023 it will show '2021 - 2023' -->
  <PropertyGroup Condition="$([System.DateTime]::Now.ToString('yyyy')) != '2021'">
    <CopyrightYears>2021 - $([System.DateTime]::Now.ToString('yyyy'))</CopyrightYears>
  </PropertyGroup>

然后,在更新程序集信息的任务中,我有一个 ItemGroup 包括

<AssemblyAttributes Include="AssemblyCopyright">
  <_Parameter1>"Copyright © $(CopyrightYears) ..."</_Parameter1>
</AssemblyAttributes>

ItemGroup 之后,我在该任务中执行以下操作

    <MakeDir Directories="$(IntermediateOutputPath)" />
    <WriteCodeFragment Language="C#"
                         OutputFile="$(IntermediateOutputPath)Version.cs"
                         AssemblyAttributes="@(AssemblyAttributes)" />
    <ItemGroup>
        <Compile Include="$(IntermediateOutputPath)Version.cs" />
    </ItemGroup>

可以用作属性的函数已记录here