如何不将 app.config 文件复制到输出目录
Posted
技术标签:
【中文标题】如何不将 app.config 文件复制到输出目录【英文标题】:How to not copy app.config file to output directory 【发布时间】:2017-03-10 10:15:04 【问题描述】:我正在构建一个 WPF 应用程序。我正在使用 Visual Studio Community 2015。为了创建一个“真正的”发布版本,我正在更改一些构建设置,以便它只生成将安装在用户计算机上的必要文件。所以没有 vshost exe,没有生成的 XML 文件等等等等。(但是我保留了 PDB 文件生成)。
我拥有我想要的一切,除了一个文件。我在每个项目中都有一个 App.config 文件。我不介意在我的调试版本中将其复制到输出目录,但在我的“真正”发布版本中,我不希望它在那里。
该文件已在其属性中设置为“不复制”。见下图:
尽管有“不复制”设置,但是,每次构建项目时,我仍然会生成一个“MyAppName.exe.config”文件。为什么会这样?我怎样才能关闭它?很烦人。
感谢您的建议!
【问题讨论】:
如果您不需要它,请将其从项目中删除。 谢谢,但这并不能真正回答问题。暂时,我正在使用构建后步骤来解决该问题,该步骤从我的发布构建的输出目录中删除文件。 只有两个选项。应用程序需要该文件,然后必须将其复制到输出文件夹。或者应用程序不需要它,那么它不应该在您的项目中。您可以在以后随时重新创建它。 @Clemens 为什么不使用“不复制到输出”选项? 【参考方案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 将根本不会复制到输出目录,但会在解决方案资源管理器中可用。
【讨论】:
以上是关于如何不将 app.config 文件复制到输出目录的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中配置 app.config 文件? [复制]
《APUE.3E》习题4.6编写自己的cp(l)程序,它复制包含空洞的文件,但不将字节0包含到输出文件中去