编译WinUI Desktop应用出现PRI错误的原因及解决方案咨询
根本原因
该错误本质是WinUI构建阶段生成PRI(包资源索引)文件时,检测到多个完全相同的资源条目导致冲突,结合你给出的项目结构,常见触发场景如下:
- 你引用的NuGet B、NuGet C、自定义控件库三者中,至少两个包包含了路径、命名完全一致的资源文件(包括resw字符串资源、XAML样式资源、图片/字体等静态资源),传递到主项目后触发重复。
- 其中某个NuGet打包时存在配置错误,重复嵌入了自身的资源文件,或者未将私有资源标记为不传递,被类库A引用后多次传递到主项目。
- 类库A自身的资源和引用的NuGet资源命名/路径完全重合,也会触发该错误。
你此前通过重新打包NuGet临时解决,就是因为重新打包时修正了资源重复嵌入的问题,但没有从根源上避免后续再次出现。
永久解决方案
- 第一步先定位冲突来源:打开Visual Studio开发者命令提示符,进入项目输出目录,执行
makepri.exe dump /if Appx\resources.pri /of res_log.xml /dt detailed,导出所有资源条目到XML文件,搜索重复的资源ID即可精准定位是哪两个包的资源冲突。 - 如果你自行维护相关NuGet包:打包时在项目文件中给私有资源的引用添加
PrivateAssets="all"属性,避免资源被传递到上层引用项目;同时给自身包的所有资源添加统一的命名空间前缀,避免和其他第三方包资源重名。 - 如果是第三方NuGet包冲突:在主项目的.csproj/.vbproj文件中添加重复资源的排除规则,示例如下:
<ItemGroup> <!-- 替换路径为冲突NuGet对应的包路径 --> <PRIResource Remove="$(NuGetPackageRoot)冲突包名\版本号\**\*.resw" /> <Page Remove="$(NuGetPackageRoot)冲突包名\版本号\**\*.xaml" /> </ItemGroup>
- 临时兼容方案:如果不想排查冲突,可直接在主项目配置中开启PRI生成时自动忽略重复条目,配置如下:
<PropertyGroup> <GenerateProjectPriFileAdditionalArguments>/l</GenerateProjectPriFileAdditionalArguments> </PropertyGroup>
内容的提问来源于stack exchange,提问作者Kanniyappan P
相关产品推荐
相关产品推荐

