【问题标题】:Dynamically display current year in assembly info在装配信息中动态显示当前年份
【发布时间】:2012-04-29 02:13:19
【问题描述】:

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

我用过

而不是这个:

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

试过这个:

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

我收到无效常量错误。

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

谢谢。

【问题讨论】:

  • 将日历提醒添加到 Outlook 或您每年 1 月 1 日使用的任何内容,以便更改您的应用程序中的所有版权日期。 :)
  • 版权声明是一个常量,内置在生成的可执行文件的文件信息中。您是否希望 Windows 每次尝试获取版权时都会在您的程序中运行某个函数?
  • 您不会选择当前年份或构建发生的年份吗?

标签: c# vb.net


【解决方案1】:

试试这个:

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

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

  <!-- 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

【讨论】:

  • 亚当的第一个建议解决方案对我有用,他只是忘记了右括号&lt;Assembly: AssemblyCopyright("Copyright $([System.DateTime]::Now.ToString('yyyy')), Company Name.")&gt;
  • 感谢@MarekMikulec - 我已经编辑了答案以包括缺少的括号。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我在另一个帖子 (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 文件。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        欲了解更多信息,请访问http://msbuildtasks.tigris.org/

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2013-12-20
            • 2021-09-28
            • 1970-01-01
            • 1970-01-01
            • 2023-03-22
            • 2011-09-04
            • 2017-05-05
            • 2019-12-03
            • 2011-09-09
            相关资源
            最近更新 更多