如何不将 app.config 文件复制到输出目录

How to not copy app.config file to output directory

我有一个正在构建的 WPF 应用程序。我正在使用 Visual Studio Community 2015。为了创建 "true" 发布版本,我正在更改一些构建设置,以便它只生成将安装在用户计算机上的必要文件。所以没有 vshost exe,没有生成的 XML 文件等等(但是我保留了 PDB 文件生成)。

除了一个文件外,我拥有我想要的一切。我在每个项目中都有一个 App.config 文件。我不介意将其复制到我的调试版本的输出目录,但在我的 "true" 发布版本中我不希望它存在。

该文件已在其属性中设置为 "Do not copy"。见下图:

尽管有 "Do not copy" 设置,但是,我每次构建项目 时仍然会生成一个 "MyAppName.exe.config" 文件 。为什么会这样?我怎样才能把它关掉?挺烦人的。

感谢任何建议!

app.config的处理比较特殊,它被By Name处理,构建过程将selectapp.config文件跟在这之后顺序:

  • 选择在主项目中设置的值$(AppConfig)。
  • 在与项目相同的文件夹中选择@(None) App.Config。
  • 在与项目相同的文件夹中选择@(Content) App.Config。
  • 在项目的任何子文件夹中选择@(None) App.Config。
  • 在项目的任何子文件夹中选择@(Content) App.Config。

$(AppConfig) 是一个 MSBuild 属性,如果它为空,它将在 "None" 或 "Content" MSBuild 中查找名称为 "App.Config" 的文件项目组,如果匹配,将使用该文件并将其复制到输出目录,用 [AssemblyName].config

替换 app.config 名称

如果要保留文件而不删除它,您需要将 "Build Action" 属性 更改为不同于 "None" 或 "Content" 的内容,您可以使用列表中的任何现有值(我建议 "AdditionalFiles")或您想要使用的任何值,即 "MyConfigFile",现在这会将文件保留在项目中,但没有生成配置的逻辑输出目录中的文件。

或者您可以将文件重命名为不同于 "app.config" 的名称,并保留 "Build Action" 和 "Copy to Output Directory" 的当前 属性 值。

在 MSBuild 参数中添加 /p:AllowedReferenceRelatedFileExtensions=.pdb 以抑制库项目 .config 文件、库 xml 文档等。通过上述,仅保留 PDB。

这个参数也可以添加到 csproj 文件中,但我个人觉得作为构建配置的一部分更容易管理。

visual studio 2017 app.config 之后默认复制到输出文件夹。根据 MS,它是设计使然 vs developercommunity

在 MSBuild 中,默认 属性 调用 AppConfig 等于“app.config” 但是,即使将 属性 设置为空 - 它仍然会使用 Find 任务找到应用程序配置并复制: https://github.com/dotnet/msbuild/blob/13522d2466ae1634177e2a6a40fefaedff95139c/src/Tasks/Microsoft.Common.CurrentVersion.targets#L1159

我发现的最佳解决方法是手动将其删除并重新添加为资源:

<ItemGroup>
  <None Remove="app.config" />
  <Resource Include="app.config" CopyToOutputDirectory="Never" />
</ItemGroup>

请注意,此更改后 app.config 根本不会复制到输出目录,但可以在解决方案资源管理器中使用。