如何从生成的MSIX包中排除重复的资源文件夹?
解决MSIX打包中Content资源重复的问题
问题根源
Windows Application Packaging Project默认会将引用的WPF项目所有输出文件同步到MSIX包的根目录,而你的WPF项目因为设置了Copy to Output Directory为Copy if newer,这些Content资源(SoundEffects、LibVLC文件夹)会同时出现在WPF项目的输出子目录(MyProject目录)和包的根目录,导致重复。
正确解决方案
修改打包项目的MSBuild配置,排除根目录下的重复资源:
- 在Visual Studio中右键点击打包项目(
MyProject.Package.wapproj),选择卸载项目。 - 右键点击已卸载的项目,选择编辑MyProject.Package.wapproj。
- 在项目文件中找到任意一个
<ItemGroup>节点(或新增一个),添加以下配置:<ItemGroup> <!-- 排除包根目录下的SoundEffects文件夹及其所有内容 --> <AppxPackagePayload Remove="SoundEffects\**" /> <!-- 排除包根目录下的LibVLC文件夹及其所有内容 --> <AppxPackagePayload Remove="LibVLC\**" /> </ItemGroup> - 保存项目文件,重新加载项目并重新生成MSIX包。
为什么之前的方法无效
- 你之前使用的
<Content Remove="..." />不适用:打包项目中控制MSIX包内容的核心项是AppxPackagePayload,而非Content,Content仅针对打包项目自身的本地文件,无法控制从引用项目同步过来的资源。 - MSIX Package Layout文件的排除规则可能存在路径匹配错误,且项目文件中的MSBuild配置优先级更高,会覆盖布局文件的设置。
注意事项
保持WPF项目中Content资源的原有设置(Build Action=Content、Copy to Output Directory=Copy if newer),确保这些资源能正常出现在MyProject的子目录中,满足用户可替换的需求。(注:MSIX包的安装目录是只读的,若要让用户替换文件,需要在应用启动时将资源复制到ApplicationData.LocalFolder这类可写目录,再进行访问)
内容的提问来源于stack exchange,提问作者Shrimperator
相关产品推荐
相关产品推荐

