gpt4 book ai didi

c# - 用 AfterBuild 替换 .exe.config 不适用于 .vshost.exe.config

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:28 25 4
gpt4 key购买 nike

我们正在使用 AfterBuild目标在 vbproj根据所选配置替换配置文件:

<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 的目标目标是在使用调试配置 (App.config) 或测试配置 (Debug.config) 构建/执行时替换发布配置 (Test.config)。

当我们发布应用程序(发布,App.config)或者如果我们构建应用程序并启动 bin\<appname>.exe 时,一切都按预期工作。 (调试或测试)。

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

为了增加困惑,我们创建了多个测试项目,使用相同的 AfterBuild目标,其中一些可以正常工作,而另一些则不能。所有项目都使用 .Net Framework 4.5.1,但我们也使用 .Net 4.5 重现了该问题。它似乎不是由项目类型引起的,因为我们能够使用控制台应用程序和 Windows 窗体应用程序重现该问题。

可能导致问题的原因是什么?

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

注意事项

  • 我们为发布环境使用默认的 App.config 文件因为 ClickOnce 似乎不支持 AfterBuild 目标。
  • 我们使用适用于 Windows 桌面的 Visual Studio Express 2013,因此我们不能使用任何插件,例如 SlowCheetah。

最佳答案

根据 Steve 的建议,我们将逻辑移至 BeforeCompile目标,指定替换 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>

它不会每次都替换文件,即使替换了,也不一定适用于 <appname>.vshost.exe.config文件。我们偶然发现了另一个指导我们走上正确道路的答案:Can Visual Studio automatically adjust the name of other file as it does with app.config?

添加以下 <Copy>命令,我们实现了预期的行为:

<!--
Copy the application's .config file, if any.
Not using SkipUnchangedFiles="true" because the application may want to change
the app.config and not have an incremental build replace it.
-->
<Copy
SourceFiles="@(AppConfigWithTargetPath)"
DestinationFiles="@(AppConfigWithTargetPath->'$(OutDir)%(TargetPath)')"
OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
Retries="$(CopyRetryCount)"
RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
UseHardlinksIfPossible="$(CreateHardLinksForAdditionalFilesIfPossible)"
>

<Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>

</Copy>

我们现在为每个配置( Debug.configTest.configRelease.config )创建了一个配置文件。 Visual Studio 替换了 App.config在每次构建/启动时使用正确的文件。结果 <appname>.vshost.exe.config文件包含正确的参数。

奖金

此解决方案的潜在好处是我们每个配置都有一个配置文件,因此我们可以更新 .vbproj文件和替换,例如,

<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>

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

关于c# - 用 AfterBuild 替换 <appname>.exe.config 不适用于 <appname>.vshost.exe.config,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30400860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com