14

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

我用了

而不是这个:

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

试过这个:

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

我得到无效的常量错误。

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

谢谢。

4

6 回答 6

26

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

于 2013-10-11T09:04:35.843 回答
2

尝试这个:

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

我还没有完全尝试过。由于我使用此答案WriteCodeFragment中描述的a 通过 .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>

您可以用作属性的函数记录在此处

于 2021-06-04T15:56:43.000 回答
1

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

这是一篇解释如何使用 MSBuild 更改 AssemblyInfo 的文章:使用版本号更新程序集。

于 2012-04-17T17:55:27.490 回答
1

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

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

于 2012-04-17T17:55:55.683 回答
1

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

你可以看看这个线程:How can you find and replace text in a file using the Windows command-line environment?

于 2012-04-17T17:56:35.687 回答
0

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

于 2020-09-17T00:22:54.150 回答