C# 替换<;appname>;。exe.config与后构建不兼容';不适用于<;appname>;。vshost.exe.config

C# 替换<;appname>;。exe.config与后构建不兼容';不适用于<;appname>;。vshost.exe.config,c#,.net,vb.net,visual-studio,app-config,C#,.net,Vb.net,Visual Studio,App Config,我们正在使用vbproj中的AfterBuild目标来替换配置文件,具体取决于所选配置: <Target Name="AfterBuild" Condition="'$(Configuration)' != 'Release'"> <Delete Files="$(TargetDir)$(TargetFileName).config" /> <Copy SourceFiles="$(ProjectDir)$(Configuration).config" De

我们正在使用
vbproj
中的
AfterBuild
目标来替换配置文件,具体取决于所选配置:

<Target Name="AfterBuild" Condition="'$(Configuration)' != 'Release'">
  <Delete Files="$(TargetDir)$(TargetFileName).config" />
  <Copy SourceFiles="$(ProjectDir)$(Configuration).config" DestinationFiles="$(TargetDir)$(TargetFileName).config" />
</Target>

例如,假设我们有3种配置:调试、测试和发布。Debug是本地调试配置。测试是用于用户验收测试的预生产环境。发布是我们的生产环境

App.config
文件中,我们存储了发布环境的配置。在
Debug.config
文件中,我们存储本地调试需要的配置。在
Test.config
文件中,我们存储用户验收环境的配置

AfterBuild
目标的目标是在构建/执行调试配置(
Debug.config
)或测试配置(
Test.config
)时替换发布配置(
App.config

当我们发布应用程序(发行版,
App.config
)或构建应用程序并启动
bin\.exe
(调试或测试)时,一切都按预期运行

但是,如果我们使用Visual Studio宿主进程从Visual Studio启动应用程序,则正确的配置将复制到
bin\.exe.config
,但Visual Studio似乎没有将正确的配置复制到
bin\.vshost.exe.config
。我们尝试清理解决方案,在调试之前执行重建,在启动之前手动删除
bin\.vshost.exe.config
文件,但托管进程似乎总是从默认的
App.config
文件复制配置。无论我们尝试从调试配置还是测试配置开始,都会出现相同的问题

为了增加混乱,我们创建了多个测试项目,使用相同的
AfterBuild
目标,其中一些工作正常,另一些工作不正常。所有项目都在使用.NETFramework4.5.1,但我们也重现了.NET4.5的问题。这似乎不是由项目类型引起的,因为我们可以通过控制台应用程序和Windows窗体应用程序重现该问题

是什么导致了这个问题

或者,我们是否可以使用另一种解决方案来管理每个环境的配置

注释

  • 我们在发布环境中使用默认的App.config文件 因为ClickOnce似乎不支持后期构建目标
  • 我们在Windows桌面上使用Visual Studio Express 2013,因此不能使用任何像SlowCheetah这样的插件

根据Steve的建议,我们将逻辑移到编译前的
目标,根据所选配置指定替换
App.config

<Target Name="BeforeCompile">
    <Delete Files="$(ProjectDir)App.config" />
    <Copy SourceFiles="$(ProjectDir)$(Configuration).config" DestinationFiles="$(ProjectDir)App.config" />
      <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
    </Copy>
</Target>


App.config
App.config
所有配置文件都将分组在Visual Studio中的主
App.config
文件下:

对我来说,它有助于禁用VisualStudio托管过程

删除以下内容中的复选标记:

Project -> Preferences -> Debug -> Enable Visual Studio hosting process

这将阻止Visual Studio覆盖*config文件。

这只是一个好主意。使用PreBuild事件并在app.config上复制所需的配置,让VS执行其常规工作?是否有兴趣查看某人是否知道如何执行此操作。。。我们尝试了,但失败了,我们求助于手动更改配置文件,以便在内部运行,而不知道为什么不添加另一个
命令。或者更简单一点,只要打开主机进程选项。@HansPassant:我很确定配置是在启动时复制的,而不是在构建时复制的。如果我们添加了另一个
命令,它在启动时也不会被执行。@Steve:我们尝试了你建议的方法,但我们仍然观察到相同的行为。如果我们将配置从Release切换到Debug,则App.config包含所选配置(Debug)的正确参数,但宿主进程仍然使用以前的配置(Release)…thx作为带有
DependentUpon
的配置,我不会想到这一点。同样的问题,您在哪里添加了复制命令?在里面
<None Include="Debug.config" />
<None Include="Release.config" />
<None Include="Debug.config">
    <DependentUpon>App.config</DependentUpon>
</None>
<None Include="Release.config">
    <DependentUpon>App.config</DependentUpon>
</None>
Project -> Preferences -> Debug -> Enable Visual Studio hosting process