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

10

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

除了一个文件外,我已经按照自己的意愿做好了所有设置。在每个项目中都有一个App.config文件。我不介意在我的调试版本中将其复制到输出目录中,但在我的“真正”的发布版本中,我不希望它出现在那里。

该文件已经在其属性中设置为“不复制”。请参见下面的图片:

App.config image

尽管已经设置为“不复制”,但我仍然会在每次构建项目时得到一个“MyAppName.exe.config”文件。为什么会这样?我怎样才能关闭它呢?这相当令人讨厌。

谢谢任何建议!


2
如果你不需要它,就把它从项目中移除。 - Clemens
3
谢谢,但那并没有真正回答问题。目前,我通过使用一个后期构建步骤来解决这个问题,该步骤会删除我的发布版本生成目录中的文件。请帮我翻译这段话。 - David
只有两个选项。如果应用程序需要该文件,则必须将其复制到输出文件夹中。如果应用程序不需要该文件,则它不应该出现在项目中。稍后您可以随时重新创建它。 - Clemens
@Clemens,如果“不要复制到输出”选项没有被执行,那为什么还要有这个选项呢? - Shiv
3个回答

30

app.config文件的处理比较特殊,它被按照名称进行处理,构建过程将按照以下顺序选择app.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”的当前属性值。


非常棒的答案,感谢您解释这些细节。有趣的事实是:我的VS2015向我的项目添加了一个“App1.config”(我不知道这个名字),结果:没有创建AssemblyName.config文件。将App1.config重命名为App.config立即解决了问题。 - Nicolas
帮助我回答了这个问题 - DanielV

1
在MSBuild参数中添加/p:AllowedReferenceRelatedFileExtensions=.pdb以抑制库项目的.config文件、库xml文档等。使用上述方法,只保留PDB文件。
此参数也可以添加到csproj文件中,但我个人发现将其作为构建配置的一部分更易于管理。

1

在使用Visual Studio 2017时,默认情况下,app.config文件会被复制到输出目录中。根据微软的说法,这是故意设计的vs developercommunity

在MSBuild中,有一个默认的属性叫做AppConfig,它等于"app.config"。然而,即使将该属性设置为空,它仍会使用Find任务查找app config并进行复制: 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将不会被复制到输出目录,但将在解决方案资源管理器中可用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接