.NET Core/.NET 6单文件发布PE Header的LegalTrademarks字段设置方法
.NET Core/.NET 6单文件发布PE Header字段设置方案
核心前提:禁止事后修改PE Header
.NET单文件发布的可执行文件内置完整性校验机制,发布后直接修改PE Header会破坏校验逻辑,导致程序无法启动。所有PE字段必须在构建/发布阶段完成配置。
一、通过项目文件配置标准PE版本字段
.NET 6默认自动生成AssemblyInfo相关属性,无需手动维护AssemblyInfo.cs。对于LegalTrademarks这类未自动映射的字段,需通过手动添加AssemblyAttribute实现:
1. 静态配置字段
在.csproj文件中添加如下配置,直接指定字段值:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <!-- 已生效的基础字段 --> <Company>你的公司名称</Company> <Description>应用描述</Description> <AssemblyVersion>1.0.0.0</AssemblyVersion> <FileVersion>1.0.0.0</FileVersion> </PropertyGroup> <ItemGroup> <!-- 手动添加LegalTrademarks对应的AssemblyAttribute --> <AssemblyAttribute Include="System.Reflection.AssemblyTrademarkAttribute"> <_Parameter1>你的商标信息</_Parameter1> </AssemblyAttribute> <!-- 其他可选PE字段配置 --> <AssemblyAttribute Include="System.Reflection.AssemblyCopyrightAttribute"> <_Parameter1>©2024 你的公司</_Parameter1> </AssemblyAttribute> <AssemblyAttribute Include="System.Reflection.AssemblyProductAttribute"> <_Parameter1>产品名称</_Parameter1> </AssemblyAttribute> </ItemGroup> </Project>
2. 动态传参配置字段
如果需要通过dotnet publish命令行动态传递字段值(比如版本号、商标信息),可先在.csproj中定义MSBuild属性占位符:
<ItemGroup> <AssemblyAttribute Include="System.Reflection.AssemblyTrademarkAttribute" Condition="'$(LegalTrademarks)' != ''"> <_Parameter1>$(LegalTrademarks)</_Parameter1> </AssemblyAttribute> <!-- 动态版本号配置 --> <AssemblyAttribute Include="System.Reflection.AssemblyVersionAttribute" Condition="'$(AssemblyVersion)' != ''"> <_Parameter1>$(AssemblyVersion)</_Parameter1> </AssemblyAttribute> </ItemGroup>
然后在发布时通过/p参数传递值:
dotnet publish -c Release -r win-x64 /p:AssemblyVersion=2.1.0.0 /p:LegalTrademarks="XX品牌 注册商标"
二、自定义PE资源(适用于特殊字段需求)
如果需要配置默认AssemblyAttribute未覆盖的PE字段(如自定义版本资源项),可通过嵌入RC资源文件实现:
- 创建
version.rc文件,编写VS_VERSION_INFO资源块:
#include <windows.h> VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,0 PRODUCTVERSION 1,0,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "080404B0" BEGIN VALUE "CompanyName", "你的公司名称\0" VALUE "LegalTrademarks", "你的商标信息\0" VALUE "ProductName", "产品名称\0" VALUE "FileVersion", "1.0.0.0\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x804, 1200 END END
- 在
.csproj中嵌入该资源文件,覆盖默认版本资源:
<ItemGroup> <EmbeddedResource Include="version.rc"> <ResourceType>NonResx</ResourceType> <Generator>ResGen</Generator> </EmbeddedResource> </ItemGroup>
三、验证字段是否生效
发布完成后,可通过以下方式确认PE字段已正确写入:
- 使用Visual Studio自带的
dumpbin工具:dumpbin /headers /version 你的应用.exe - 用Resource Hacker打开生成的可执行文件,查看
Version Info节点下的内容。
内容的提问来源于stack exchange,提问作者sɐunıɔןɐqɐp
相关产品推荐
相关产品推荐

