如何排除UWP项目发布MSIX包时引入的多余sni.dll依赖
原因说明
你配置的Post-Build删除脚本只对本地常规生成的输出目录生效,UWP发布打包走独立的管线:在完成常规生成后,还会执行一次全量传递依赖扫描,从依赖缓存、引用项目录中重新收集所有判定为需要的文件到打包暂存区,因此sni.dll会被重新拷贝进最终的msix包中。
可行解决方案
按优先级从高到低尝试以下配置:
方案1:在项目文件中全局排除sni.dll的打包规则
这是最一劳永逸的配置,不会随发布配置变化失效:
- 右键UWP主项目,选择「编辑项目文件」
- 在项目文件的顶层
<Project>节点下,添加如下配置项:
<ItemGroup> <!-- 从内容、引用项中移除sni.dll --> <Content Remove="sni.dll" /> <Reference Remove="sni.dll" /> <!-- 显式标记sni.dll不参与拷贝、不参与打包 --> <None Include="sni.dll"> <CopyToOutputDirectory>Never</CopyToOutputDirectory> <Pack>False</Pack> </None> </ItemGroup>
- 保存项目文件后重新执行发布打包即可。
方案2:在发布向导中手动排除文件
如果不想修改项目文件,可以在创建应用包的向导流程中操作:
- 走正常的「创建应用包」流程,走到「确认选择和配置」页
- 点击页面中的文件清单入口,展开所有将被打包进msix的文件列表
- 在列表中找到
sni.dll,取消它前面的勾选框 - 继续走完发布流程,这个排除规则会被保存到当前发布配置文件中,后续使用同一配置发布不会重复包含该文件。
方案3:添加打包流程专属的删除钩子
如果前两种方案配置后仍有残留,可以添加针对打包暂存目录的MSBuild目标,在打包执行前删除暂存的sni.dll:
- 同样打开UWP主项目的项目文件编辑界面
- 在顶层
<Project>节点下添加如下Target配置:
<Target Name="RemoveUnusedSniDll" AfterTargets="_GenerateAppxPackageContent" BeforeTargets="_CreateAppxPackage"> <!-- 删除打包暂存目录中的sni.dll --> <Delete Files="$(AppxPackageLayoutPath)sni.dll" /> <!-- 删除输出目录中所有Appx包路径下残留的sni.dll --> <Delete Files="$(OutputPath)AppxPackages\**\sni.dll" /> </Target>
验证方式
打包完成后不要直接提交WACK检测,先做手动校验:
- 找到生成的*.msixbundle文件,将后缀改为.zip后解压
- 在解压后的文件夹中找到对应架构的*.msix文件(比如x64架构的包),同样改后缀为.zip解压
- 检查解压后的根目录,确认不存在
sni.dll即可。
注意:该操作仅在你确认代码永远不会调用到依赖sni.dll的逻辑时安全,如果后续新增SQL Client相关的功能调用,需要移除上述排除配置,否则会出现运行时DLL加载失败的问题。
内容的提问来源于stack exchange,提问作者jlo-gmail
相关产品推荐
相关产品推荐

