【问题标题】:How to not copy app.config file to output directory如何不将 app.config 文件复制到输出目录
【发布时间】:2017-03-10 10:15:04
【问题描述】:

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

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

该文件已在其属性中设置为“不复制”。见下图:

尽管有“不复制”设置,但是,每次构建项目时,我仍然会生成一个“MyAppName.exe.config”文件。为什么会这样?我怎样才能关闭它?很烦人。

感谢您的建议!

【问题讨论】:

  • 如果您不需要它,请将其从项目中删除。
  • 谢谢,但这并不能真正回答问题。暂时,我正在使用构建后步骤来解决该问题,该步骤从我的发布构建的输出目录中删除文件。
  • 只有两个选项。应用程序需要该文件,然后必须将其复制到输出文件夹。或者应用程序不需要它,那么它不应该在您的项目中。您可以在以后随时重新创建它。
  • @Clemens 为什么不使用“不复制到输出”选项?

标签: c# wpf visual-studio-2015 app-config visual-studio-project


【解决方案1】:

app.config的处理比较特殊,被按名称处理,构建过程会按照这个顺序选择app.config文件:

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

$(AppConfig) 是一个 MSBuild 属性,如果它为空,它将在“无”或“内容”MSBuild 项目组中查找名称为“App.Config”的文件,如果匹配,则该文件将被使用并将被复制到输出目录,将 app.config 名称替换为 [AssemblyName].config

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

或者您可以将文件重命名为不同于“app.config”的名称,并保留“构建操作”和“复制到输出目录”的当前属性值。

【讨论】:

  • 出色的答案,感谢您解释这些细节。有趣的事实:我的 VS2015 在我的项目中添加了一个“App1.config”(我不知道名称上瘾)-> 结果:没有创建 AssemblyName.config 文件。将 App1.config 重命名为 App.config 立即有所帮助。
  • 帮我回答this
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    Visual Studio 2017 后 app.config 默认复制到输出文件夹。根据 MS 的说法,这是设计使然 vs developercommunity

    在 MSBuild 中调用了名为 AppConfig 的默认属性,它等于“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 将根本不会复制到输出目录,但会在解决方案资源管理器中可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多