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

本文关键字:动态显示 信息 | 更新日期: 2023-09-27 18:31:29

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

我用了

取而代之的是:

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

试过这个:

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

我收到无效的常量错误。

我不想使用注册表项条目,执行此操作的最佳方法是什么?(这样当用户右键单击EXE并查找程序集信息时可以看到当前年份)。

谢谢。

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

我在另一篇文章(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文件。

试试这个:

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

我还没有完全尝试过这个。 由于我使用本答案中所述的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>

此处记录了可用作属性的函数

可能最好的方法是使用 NAnt 或 MSBuild 等工具将其集成到构建过程中。

下面是一篇介绍如何使用 MSBuild 更改 AssemblyInfo 的文章:使用版本号更新程序集。

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

有关更多信息,请访问 http://msbuildtasks.tigris.org/

通常,对于此类替换,您使用预生成步骤,该步骤调用自动生成 assemblyInfo.cs 文件的脚本。

你可以看看这个线程:如何使用Windows命令行环境查找和替换文件中的文本?

我有类似的问题,但对于新样式的csproj文件;其中包含文件版本信息。我在这里找到了一个很好的答案 如何在构建后事件中定义当前系统日期。奇怪的是,这是一个与我和OP问题有些不同的问题。但是,我认为公认的答案是我想要的。也就是说,csproj 文件中的 $([System.DateTime]::Now.Year) 计算结果为当前年份。

这是我使用预生成任务的解决方案。应该在窗口和Unix上工作。将与 dotnet 一起使用(如果您运行 dotnet build ,则在 dotnet run 之前)。

将此添加到 .csproj


  <!-- update assembly info -->
  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Condition="$(OS) == Windows_NT" Command="set TargetDir=$(TargetDir)&#xD;&#xA;..'scripts'updateAssemblyInfo.cmd" />
    <Exec Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::OSX)))' OR '$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))'" Command="export TargetDir=$(TargetDir)&#xD;&#xA;bash ../scripts/updateAssemblyInfo.sh" />
  </Target>

AssemblyInfo.base.txt

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCopyrightAttribute("Copyright © 2009 - <#=DateTime.Now.Year#> COMPANYNAME. All rights reserved.")]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("xxx")]
// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// [assembly: AssemblyVersion("1.0.0.0")]
// [assembly: AssemblyFileVersion("1.0.0.0")]

脚本文件夹中更新组装信息.cmd

for /f %%i in ('"powershell (Get-Date).ToString('"yyyy'")"') do set currentYear=%%i
echo %currentYear%
powershell -Command "(gc 'AssemblyInfo.base.txt' -encoding "UTF8") -replace '<#=DateTime.Now.Year#>', '%currentYear%' | Out-File -encoding "UTF8" 'AssemblyInfo.cs'"

updateAssemblyInfo.sh

#!/bin/bash
year=$(date +%Y)
echo "Current Year : $year"
contents=$(cat AssemblyInfo.base.txt)
# echo $contents
echo $contents | awk -v yr=$year '{gsub("<#=DateTime.Now.Year#>",yr); print}' > AssemblyInfo.cs