ClickOnce的 deps.json文件名不正确
我正在为.NET 9开发一个ClickOnce SDK项目。我已经从.NET 4.8升级。
问题在于在构建过程中生成的 MyApp.deps.json 文件,在进入应用程序文件负载文件夹时被重命名为 app.publishMyApp.deps.json。
名称 app.publishMyApp.deps.json 显然是错误的,也不是.NET期望的,因此启动时出现错误(期望的名称是 MyApp.deps.json)。
这个名字看起来像是发布文件夹名称(app.publish)以某种方式被追加到文件名之前。原因我也不知道。它在我的其他ClickOnce SDK项目中并没有发生。
它是在MSBuild的 Publish任务的某个阶段发生的。
以下是在Visual Studio构建后,使用这个MSBuild Publish任务时我可以复现的问题:
msbuild MyApp.csproj /t:Publish
/p:PublishDir="C:\temp\MyAppPublish"
/p:PublishProtocol=ClickOnce
/p:MapFileExtensions=false
/p:GenerateManifests=true
我注意到其实是发布路径中的叶节点(MyAppPublish)决定了被追加的前缀。因此根据这个参数,我可以得到 app.publishMyApp.deps.json 或 MyAppPublishMyApp.deps.json。
下面是来自Publish任务的一些输出,展示了错误发生的位置:
_CopyResolvedFilesToPublishAlways
将文件从 "D:\a\1\b\MyApp\app.publishMyApp.deps.json" 复制到 "D:\a\1\b\Test\MyApp\app.publish\MyApp.deps.json"。
复制到应用程序文件:
_CopyFilesToPublishFolder:
将文件从 "D:\a\1\b\MyApp\app.publishMyApp.deps.json" 复制到 "D:\a\1\b\MyApp\app.publish\Application Files\MyApp_2026_309_1647_45076\app.publishMyApp.deps.json"。
有意思的是,第一步复制实际上将文件重命名为期望的名称,但第二步将其直接复制到载荷文件夹中(那就是最终在客户端机器上安装的那个位置)。
有人知道这是怎么回事吗?或者如何修复?
解决方案
尝试在 PublishDir 结尾处加一个斜杠
msbuild MyApp.csproj ^
/t:Publish ^
/p:PublishDir="C:\temp\MyAppPublish\" ^
/p:PublishProtocol=ClickOnce ^
/p:MapFileExtensions=false ^
/p:GenerateManifests=true
结尾的斜杠可以防止叶子文件夹被解释为文件身份的一部分,这可能是原因。