You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio项目模板中AssemblyInfo.cs通用化动态构建咨询

动态构建AssemblyInfo.cs(基于Resources.resx值)在Visual Studio项目模板中

当然可以动态构建AssemblyInfo.cs,完全不用硬编码每个值!作为经常折腾VS项目模板的开发者,我给你分享几个实用的方案,刚好适配你已经在Resources.resx里存好通用值的场景:

方案1:用T4文本模板(最灵活的方式)

T4模板可以直接读取Resources.resx里的内容,自动生成AssemblyInfo.cs,步骤很清晰:

  1. 删掉原有的AssemblyInfo.cs,右键项目添加一个T4文本模板(比如命名为AssemblyInfo.tt)
  2. 在模板里写代码读取Resources.resx的键值对,生成对应的Assembly属性,示例代码如下:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ import namespace="System.Resources" #>
<#
// 定位到你的Resources.resx文件路径
var resxFilePath = Host.ResolvePath("Properties/Resources.resx");
var resourceManager = new ResXResourceManager(resxFilePath);
#>
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly: AssemblyTitle("<#= resourceManager.GetString("AssemblyTitle") #>")]
[assembly: AssemblyDescription("<#= resourceManager.GetString("AssemblyDescription") #>")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("<#= resourceManager.GetString("AssemblyCompany") #>")]
[assembly: AssemblyProduct("<#= resourceManager.GetString("AssemblyProduct") #>")]
[assembly: AssemblyCopyright("<#= resourceManager.GetString("AssemblyCopyright") #>")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

[assembly: ComVisible(false)]

[assembly: Guid("<#= resourceManager.GetString("AssemblyGuid") #>")]
[assembly: AssemblyVersion("<#= resourceManager.GetString("AssemblyVersion") #>")]
[assembly: AssemblyInformationalVersion("<#= resourceManager.GetString("AssemblyInformationalVersion") #>")]
[assembly: NeutralResourcesLanguage("<#= resourceManager.GetString("NeutralResourcesLanguage") #>")]
  1. 保存模板后,VS会自动生成对应的AssemblyInfo.cs文件;之后如果Resources.resx更新了,右键T4模板选择Run Custom Tool就能重新生成最新的AssemblyInfo。

方案2:结合VS项目模板的替换参数

如果你是在做可复用的VS项目模板(打包成.zip那种),可以用模板的替换机制配合Resources.resx:

  1. 打开模板的.vstemplate文件,定义替换参数,把Resources.resx里的值对应进去:
<TemplateContent>
  <Project File="YourTemplate.csproj" ReplaceParameters="true">
    <Replacements>
      <Replacement Token="$AssemblyTitle$" Value="Template" />
      <Replacement Token="$AssemblyCompany$" Value="Sample Company" />
      <!-- 其他参数对应Resources.resx里的键值 -->
    </Replacements>
  </Project>
</TemplateContent>
  1. 把AssemblyInfo.cs改成模板文件,把硬编码的值换成替换标记:
[assembly: AssemblyTitle("$AssemblyTitle$")]
[assembly: AssemblyDescription("$AssemblyDescription$")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("$AssemblyCompany$")]
// 其他Assembly属性同理替换成对应的Token
  1. 确保Resources.resx里的内容和模板参数保持一致,也可以加个自定义脚本,在模板生成后自动把参数同步到Resources.resx里。

方案3:用MSBuild任务自动同步

如果希望每次构建时自动从Resources.resx同步值到AssemblyInfo.cs,可以给项目加个MSBuild任务:

  1. 编辑项目的.csproj文件,添加如下配置:
<Target Name="SyncAssemblyInfoFromResources" BeforeTargets="CoreCompile">
  <!-- 这里可以用PowerShell或者自定义任务提取Resources.resx的内容,替换AssemblyInfo -->
  <Exec Command="powershell -Command &quot;(Get-Content Properties/AssemblyInfo.cs) -replace 'AssemblyTitle\(&quot;.*&quot;\)', 'AssemblyTitle(&quot;$(AssemblyTitle)&quot;)' | Set-Content Properties/AssemblyInfo.cs&quot;" />
  <!-- 重复上述命令替换其他Assembly属性 -->
</Target>

这种方式适合需要全程自动化,不用手动操作的场景。

小提醒:不管用哪种方案,建议让Resources.resx里的键名和AssemblyInfo的属性名一一对应(比如AssemblyTitle、AssemblyCompany),这样读取和替换的时候不容易出错。

内容的提问来源于stack exchange,提问作者br0ken.pipe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:30:36