Visual Studio项目模板中AssemblyInfo.cs通用化动态构建咨询
动态构建AssemblyInfo.cs(基于Resources.resx值)在Visual Studio项目模板中
当然可以动态构建AssemblyInfo.cs,完全不用硬编码每个值!作为经常折腾VS项目模板的开发者,我给你分享几个实用的方案,刚好适配你已经在Resources.resx里存好通用值的场景:
方案1:用T4文本模板(最灵活的方式)
T4模板可以直接读取Resources.resx里的内容,自动生成AssemblyInfo.cs,步骤很清晰:
- 删掉原有的
AssemblyInfo.cs,右键项目添加一个T4文本模板(比如命名为AssemblyInfo.tt) - 在模板里写代码读取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") #>")]
- 保存模板后,VS会自动生成对应的
AssemblyInfo.cs文件;之后如果Resources.resx更新了,右键T4模板选择Run Custom Tool就能重新生成最新的AssemblyInfo。
方案2:结合VS项目模板的替换参数
如果你是在做可复用的VS项目模板(打包成.zip那种),可以用模板的替换机制配合Resources.resx:
- 打开模板的
.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>
- 把AssemblyInfo.cs改成模板文件,把硬编码的值换成替换标记:
[assembly: AssemblyTitle("$AssemblyTitle$")] [assembly: AssemblyDescription("$AssemblyDescription$")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("$AssemblyCompany$")] // 其他Assembly属性同理替换成对应的Token
- 确保Resources.resx里的内容和模板参数保持一致,也可以加个自定义脚本,在模板生成后自动把参数同步到Resources.resx里。
方案3:用MSBuild任务自动同步
如果希望每次构建时自动从Resources.resx同步值到AssemblyInfo.cs,可以给项目加个MSBuild任务:
- 编辑项目的
.csproj文件,添加如下配置:
<Target Name="SyncAssemblyInfoFromResources" BeforeTargets="CoreCompile"> <!-- 这里可以用PowerShell或者自定义任务提取Resources.resx的内容,替换AssemblyInfo --> <Exec Command="powershell -Command "(Get-Content Properties/AssemblyInfo.cs) -replace 'AssemblyTitle\(".*"\)', 'AssemblyTitle("$(AssemblyTitle)")' | Set-Content Properties/AssemblyInfo.cs"" /> <!-- 重复上述命令替换其他Assembly属性 --> </Target>
这种方式适合需要全程自动化,不用手动操作的场景。
小提醒:不管用哪种方案,建议让Resources.resx里的键名和AssemblyInfo的属性名一一对应(比如
AssemblyTitle、AssemblyCompany),这样读取和替换的时候不容易出错。
内容的提问来源于stack exchange,提问作者br0ken.pipe
相关产品推荐
相关产品推荐

