停止MSBuild在多目标项目的.NET6分支中使用App.config

sc4hvdpw  于 2023-04-08  发布在  .NET
关注(0)|答案(1)|浏览(143)

问题:

我们有一个针对net472;net6.0的多目标项目。
net472分支中,它使用App.config(存在于项目的根目录中)来配置各种设置(GCHeapCount,跟踪中的锁,最小支持运行时间,GC)。它工作得很好,App.config会自动复制到输出为<projectName>.exe.config,然后在应用程序启动时自动加载。
问题出在net6.0分支上。显然,我们不想在编译时重用相同的App.config。主要是因为App.config中支持的运行时是错误的;第二,因为我们想要以不同的方式配置GC,等等。
但是,令人遗憾的是,似乎msbuild/roslyn(不确定是谁)仍然采用App.config,将其复制到输出为<projectName>.exe.config;当dll启动时-配置被加载(在ConfigurationManager.PrepareConfigSystem上),这实际上并不起作用,因为例如system.diagnostics跟踪设置是不可识别的。

所需状态:

理想情况下,我希望net472分支没有太多更改,并且net6.0分支简单地忽略App.config文件,即,因此它甚至不会复制到编译的输出文件夹。

尝试:

我一直在寻找一种方法来做这件事。
必应聊天(Bing chat)给了一个不起作用的答案(时代的标志?),谷歌主要是关于App.config被无意中忽略的问题,我发现的唯一接近的东西是:https://developercommunity.visualstudio.com/t/vs-always-copies-all-appconfig-files-to-output-fol/19696,但仅包含发布的解决方法;没有什么只是编译。
我也试过这个把戏:

<ItemGroup>
    <Content Remove="App.config" />
    <None Include="App.config" />
  </ItemGroup>

但那也没用

e3bfsja2

e3bfsja21#

看起来app.config支持在Microsoft.Common.CurrentVersion.targets中,它是随SDK一起分发的。
FindAppConfigFile taskNone一起使用作为主列表,Content作为辅助列表。名为AppConfig的属性设置了文件的路径和名称。如果AppConfig属性已经有值,则不会调用FindAppConfigFile任务。
您可以尝试以下操作:

<ItemGroup  Condition="'$(TargetFramework)' == 'net6.0'">
    <None Remove="App.config" />
    <Content Remove="App.config" />
  </ItemGroup>

这应该确保对于net6.0分支,该文件被忽略。
如果需要特定于net6.0的app.config,您可以为文件指定任何名称并设置AppConfig属性,例如:

<PropertyGroup  Condition="'$(TargetFramework)' == 'net6.0'">
    <AppConfig>config.net6</AppConfig>
  </PropertyGroup>

无论源文件的名称如何,生成的配置文件名都将是$(TargetFileName).config

相关问题