.NET Framework项目添加Git提交哈希至可执行文件详情失败求助
解决非SDK风格.NET Framework项目添加Git提交哈希到可执行文件详情的问题
传统非SDK风格的.NET Framework项目和SDK风格项目(包括目标.NET Framework的SDK项目)的构建流程存在差异,你之前使用的InitializeSourceControlInformation是SDK项目特有的构建目标,因此在非SDK项目中不会触发,导致Git哈希注入失效。以下是针对这类项目的可行解决方案:
方法一:通过临时AssemblyInfo文件注入哈希
传统.NET Framework项目依赖AssemblyInfo.cs管理程序集元数据,我们可以通过MSBuild任务在编译前生成包含Git哈希的临时AssemblyInfo片段,自动集成到编译流程中:
将以下代码添加到你的.NET Framework项目文件(.csproj)中:
<Target Name="InjectGitHashIntoAssemblyInfo" BeforeTargets="Compile"> <!-- 执行Git命令获取提交哈希 --> <Exec Command="git describe --long --always --dirty --exclude=* --abbrev=8" ConsoleToMSBuild="True" IgnoreExitCode="False"> <Output PropertyName="GitCommitHash" TaskParameter="ConsoleOutput" /> </Exec> <!-- 移除哈希字符串中的换行符,避免格式异常 --> <PropertyGroup> <GitCommitHash>$(GitCommitHash.Trim())</GitCommitHash> </PropertyGroup> <!-- 生成临时AssemblyInfo文件,注入带哈希的版本信息 --> <WriteLinesToFile File="$(IntermediateOutputPath)GitAssemblyInfo.cs" Overwrite="True" Lines=' using System.Reflection; [assembly: AssemblyInformationalVersion("$(AssemblyInformationalVersion) $(GitCommitHash)")] ' /> <!-- 将临时文件加入编译列表 --> <ItemGroup> <Compile Include="$(IntermediateOutputPath)GitAssemblyInfo.cs" /> </ItemGroup> </Target>
说明:
- 该目标会在编译前自动执行,将Git哈希追加到
AssemblyInformationalVersion属性中,这个属性对应可执行文件详情里的「产品版本」字段。 - 如果你的项目原本没有定义
AssemblyInformationalVersion,可以直接将Lines里的内容改为[assembly: AssemblyInformationalVersion("$(GitCommitHash)")],直接用哈希作为产品版本。
方法二:通过编译常量注入哈希(修改现有AssemblyInfo)
如果你希望直接复用项目中已有的AssemblyInfo.cs,可以通过定义编译常量的方式注入哈希:
- 在项目的
AssemblyInfo.cs中添加以下代码:
#if GIT_HASH [assembly: AssemblyInformationalVersion("1.0.0.0 $(GIT_HASH)")] #endif
- 将以下代码添加到项目文件(
.csproj)中:
<Target Name="SetGitHashConstant" BeforeTargets="Compile"> <Exec Command="git describe --long --always --dirty --exclude=* --abbrev=8" ConsoleToMSBuild="True" IgnoreExitCode="False"> <Output PropertyName="GitCommitHash" TaskParameter="ConsoleOutput" /> </Exec> <PropertyGroup> <GitCommitHash>$(GitCommitHash.Trim())</GitCommitHash> <DefineConstants>$(DefineConstants);GIT_HASH=$(GitCommitHash)</DefineConstants> </PropertyGroup> </Target>
说明:编译时会自动将Git哈希替换到$(GIT_HASH)常量中,最终生成带哈希的版本信息。
注意事项
- 之前使用的AssemblyInfoGenerationSdk工具仅适用于SDK风格项目,和传统非SDK项目不兼容,因此会导致构建异常,直接使用上述MSBuild任务即可解决问题。
- 操作完成后,清理项目并重新构建,右键生成的可执行文件→属性→详细信息,即可看到包含Git哈希的版本字段。
内容的提问来源于stack exchange,提问作者theateist
相关产品推荐
相关产品推荐

