.NET 5发布版EXE图标无法更新问题求助
.NET 5 WPF发布版图标未更新的解决方案
问题背景
基于.NET 5开发的WPF应用,将占位图标LogoTemp替换为正式图标Logo.ico后,调试版可正常显示新图标,但发布版始终保留旧图标。已尝试通过项目属性修改、直接编辑.csproj文件指定图标路径,均未解决问题。
项目.csproj内容如下:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net5.0-windows</TargetFramework> <RootNamespace>LPG_Launcher</RootNamespace> <UseWPF>true</UseWPF> <Company>LowPoly Games</Company> <Authors>LowPoly Games</Authors> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PlatformTarget>x64</PlatformTarget> <DebugType>none</DebugType> <DebugSymbols>false</DebugSymbols> <TransformOnBuild>true</TransformOnBuild> <OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles> <TransformOutOfDateOnly>false</TransformOutOfDateOnly> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <Optimize>true</Optimize> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <DebugType>full</DebugType> <DebugSymbols>true</DebugSymbols> <PlatformTarget>x64</PlatformTarget> <TransformOnBuild>true</TransformOnBuild> <OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles> <TransformOutOfDateOnly>false</TransformOutOfDateOnly> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <DebugType>full</DebugType> <DebugSymbols>true</DebugSymbols> <TransformOnBuild>true</TransformOnBuild> <OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles> <TransformOutOfDateOnly>false</TransformOutOfDateOnly> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <PlatformTarget>x64</PlatformTarget> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"> <DebugType>none</DebugType> <DebugSymbols>false</DebugSymbols> <PlatformTarget>x64</PlatformTarget> <TransformOnBuild>true</TransformOnBuild> <OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles> <TransformOutOfDateOnly>false</TransformOutOfDateOnly> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <Optimize>true</Optimize> </PropertyGroup> <Target Name="PostBuild" AfterTargets="PostBuildEvent"> <Exec Command=""$(ProjectDir)..\Build Assistant\bin\Release\Build Assistant.exe" "MakeDir$(ConfigurationName)"
if $(ConfigurationName) == Release (
 del /S *.pdb
 "$(ProjectDir)..\Build Assistant\bin\Release\Build Assistant.exe" "MoveGames"
 
 "$(ProjectDir)..\Build Assistant\bin\Release\Build Assistant.exe" "CheckInstallers"
)" /> </Target> <PropertyGroup> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <TransformOnBuild>true</TransformOnBuild> <OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles> <TransformOutOfDateOnly>false</TransformOutOfDateOnly> <PackageIcon></PackageIcon> <PackageIconUrl /> <ApplicationIcon>Logo.ico</ApplicationIcon> <StartupObject /> </PropertyGroup> <ItemGroup> <Compile Remove="Installer\BuildAssistant.cs" /> <Compile Remove="Installer\InstallerVersionControl.cs" /> </ItemGroup> <ItemGroup> <None Remove="Fonts\BebasNeueBold.ttf" /> <None Remove="Installer\BuildAssistant.exe" /> <None Remove="Installer\InstallerVersionControl.exe" /> <None Remove="Resources\Close.png" /> <None Remove="Resources\FG.png" /> <None Remove="Resources\GHGLogo.png" /> <None Remove="Resources\HCPlus" /> <None Remove="Resources\HCPlus.png" /> <None Remove="Resources\ISPLogo.png" /> <None Remove="Resources\Logo.ico" /> <None Remove="Resources\Minimise.png" /> </ItemGroup> <ItemGroup> <COMReference Include="{d37e2a3e-8545-3a39-9f4f-31827c9124ab}"> <WrapperTool>tlbimp</WrapperTool> <VersionMinor>4</VersionMinor> <VersionMajor>2</VersionMajor> <Guid>d37e2a3e-8545-3a39-9f4f-31827c9124ab</Guid> </COMReference> </ItemGroup> <ItemGroup> <None Include="VersionAutoIncrementer.tt"> <Generator>TextTemplatingFileGenerator</Generator> <LastGenOutput>VersionAutoIncrementer.txt</LastGenOutput> </None> </ItemGroup> <ItemGroup> <Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" /> </ItemGroup> <ItemGroup> <Folder Include="GameData\" /> </ItemGroup> <ItemGroup> <Resource Include="Fonts\BebasNeueBold.ttf"> <CopyToOutputDirectory>Never</CopyToOutputDirectory> </Resource> <Resource Include="Resources\Close.png" /> <Resource Include="Resources\FG.png" /> <Resource Include="Resources\GHGLogo.png" /> <Resource Include="Resources\HCPlus.png" /> <Resource Include="Resources\ISPLogo.png" /> <Resource Include="Resources\Logo.ico" /> <Resource Include="Resources\Minimise.png" /> </ItemGroup> <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v16.0\TextTemplating\Microsoft.TextTemplating.targets" /> <Target Name="PreBuild" BeforeTargets="PreBuildEvent"> <Exec Command="if $(ConfigurationName) == Release (
 "$(ProjectDir)..\Build Assistant\bin\Release\Build Assistant.exe" "CleanDir$(ConfigurationName)"
)" /> </Target> </Project>
排查与解决步骤
彻底清理构建缓存
发布版构建缓存可能残留旧图标,执行以下操作:- 手动删除项目根目录下的
bin和obj文件夹 - 在Visual Studio中依次点击生成>清理解决方案,再重新生成发布版本
- 手动删除项目根目录下的
验证图标路径与属性
从.csproj看,ApplicationIcon已设置为Logo.ico,但需确认:- 图标文件路径正确:如果
Logo.ico在Resources文件夹下,应将ApplicationIcon改为Resources\Logo.ico - 图标文件的生成操作:在Visual Studio中选中
Logo.ico,右键选择属性,设置生成操作为Resource,复制到输出目录为不复制
- 图标文件路径正确:如果
检查PostBuild脚本的影响
项目的PostBuild事件调用了外部工具Build Assistant.exe,其中MoveGames和CheckInstallers操作可能会修改或替换最终生成的EXE文件,导致旧图标被恢复。需要验证该工具的具体行为,确认其不会覆盖EXE的图标资源。为发布配置单独指定图标
在发布版的PropertyGroup中显式添加ApplicationIcon属性,确保发布配置优先使用指定图标:<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <!-- 保留原有属性 --> <ApplicationIcon>Resources\Logo.ico</ApplicationIcon> <!-- 根据实际路径调整 --> </PropertyGroup>检查图标文件完整性
确认Logo.ico包含所有必要的尺寸(16x16、32x32、48x48、256x256),部分系统或发布流程会因图标尺寸不全而 fallback 到旧图标资源。
内容的提问来源于stack exchange,提问作者Istalri Skolir
相关产品推荐
相关产品推荐

