Winforms ClickOnce 发布因 app.config 次转换而失败

Winforms ClickOnce publish fails with app.config transforms

我将 app.config 转换添加到现有的 Windows 使用 ClickOnce 发布的 Forms 客户端应用程序,现在它不会发布。错误信息:

"obj\Release\Client.csproj.App.config;obj\Release\MyAppName.exe.config" is an invalid value for the "ConfigFile" parameter of the "GenerateApplicationManifest" task. Multiple items cannot be passed into a parameter of type "Microsoft.Build.Framework.ITaskItem"

当我取消选中 "Enable ClickOnce security settings"(项目属性 > 安全)时,项目将从 Visual Studio 2015 年开始构建并 运行 而不会出现此错误,但是当我尝试使用 ClickOnce 发布时,错误 returns。启用安全性会导致项目根本无法构建。无论哪种方式,错误都是一样的。

app.config 设置为 "Copy Always"。

我尝试删除 clickonce 证书并安装一个新的,但症状没有任何区别。

请注意,这是一个 Windows 表单应用程序,而不是网络应用程序。这些转换是使用 Configuration Transform 扩展创建的(与 SlowCheetah 的工作方式相同)。我已经将这个设置成功地用于其他应用程序,到目前为止还没有发现这个应用程序和成功的应用程序之间的设置有什么不同。

.csproj 文件的这一部分似乎与问题有关:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
      <Target Name="AfterCompile" Condition="Exists('App.$(Configuration).config')">
        <!--Generate transformed app config in the intermediate directory-->
        <TransformXml Source="App.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="App.$(Configuration).config" />
        <!--Force build process to use the transformed configuration file from now on.-->
        <ItemGroup>
          <AppConfigWithTargetPath Remove="App.config" />
          <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
            <TargetPath>$(TargetFileName).config</TargetPath>
          </AppConfigWithTargetPath>
        </ItemGroup>
      </Target>

另一个 post 建议删除 ItemGroup 节点。当我这样做时,项目在 VS 中构建和 运行s,并且能够发布到测试位置,但 app.config 转换不会发生。

已解决:这些症状是由于 Microsoft.Bcl 不能很好地与配置转换和 ClickOnce 一起发布一起使用引起的。此应用程序是使用 Bcl 使用 .NET 4 创建的,以便在旧 XP 机器上使用 运行 时使用 async/await 模式。从那时起,我们的用户已升级到 Windows 7 & 10,因此我能够将应用程序升级到 .NET 4.5.2 并删除 Bcl 包。 Bcl 消失后,问题就完全解决了。 (可能有某种 hack 可以让 Bcl 与配置转换和 clickonce 一起正常工作,但由于我能够升级,我不会进一步追求它)。

如果接受的答案对您不起作用(就像它对我不起作用)。请查看此 question:

的解决方案

I ran into this same problem. What fixed it for me was changing the line in the transform from above

from

<AppConfigWithTargetPath Remove="app.config" />

to

<AppConfigWithTargetPath Remove="@(AppConfigWithTargetPath)" />