在装配体信息中动态显示当前年份
本文关键字:动态显示 信息 | 更新日期: 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)
..'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)
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