Winforms ClickOnce发布与app.config转换失败

Winforms ClickOnce发布与app.config转换失败,winforms,clickonce,app-config,publishing,config-transformation,Winforms,Clickonce,App Config,Publishing,Config Transformation,我将app.config转换添加到使用ClickOnce发布的现有Windows窗体客户端应用程序中,现在它将不会发布。错误消息: “obj\Release\Client.csproj.App.config;obj\Release\MyAppName.exe.config” 是的“ConfigFile”参数的无效值 “GenerateApplicationManifest”任务。无法传递多个项目 转换为“Microsoft.Build.Framework.ITaskItem”类型的参数 当我取消

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

“obj\Release\Client.csproj.App.config;obj\Release\MyAppName.exe.config” 是的“ConfigFile”参数的无效值 “GenerateApplicationManifest”任务。无法传递多个项目 转换为“Microsoft.Build.Framework.ITaskItem”类型的参数

当我取消选中“启用ClickOnce安全设置”(项目属性>安全性)时,项目将从Visual Studio 2015生成并运行,不会出现此错误,但当我尝试使用ClickOnce发布时,会返回错误。启用安全性会导致项目根本不生成。无论如何,错误都是一样的

app.config设置为“始终复制”

我尝试删除clickonce证书并安装一个新的证书,但症状没有差异

注意:这是Windows窗体应用程序,不是web应用程序。转换是使用扩展创建的(工作原理与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>

$(TargetFileName).config

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

已解决:这些症状是由Microsoft.Bcl不能很好地处理配置转换和ClickOnce一起发布引起的。此应用程序是使用Bcl使用.NET 4创建的,以便在旧XP机器上运行时使用异步/等待模式。从那时起,我们的用户已经升级到Windows 7和10,因此我能够将应用升级到.NET 4.5.2并删除Bcl软件包。随着Bcl的消失,问题完全解决了。(可能会有一些黑客让Bcl正确使用配置转换和clickonce,但由于我能够升级,因此我不再进一步研究它)。

如果接受的答案对您不起作用(就像它对我不起作用一样)。请参阅此问题的解决方案:

我遇到了同样的问题。对我来说,解决这个问题的方法是从上方改变变换中的线条




Update:为了及时发布,我已经删除了转换,现在选择了一个基本的app.config。我仍然希望解决最初的问题,并使用转换。这应该是公认的答案,因为它适用于所有情况,而不是OP的情况。
<AppConfigWithTargetPath Remove="app.config" />
<AppConfigWithTargetPath Remove="@(AppConfigWithTargetPath)" />