子项目的 App.config 未复制到输出

Posted

技术标签:

【中文标题】子项目的 App.config 未复制到输出【英文标题】:App.config for child project not being copied to output 【发布时间】:2012-02-12 13:03:06 【问题描述】:

我有一个包含两个可执行项目的解决方案。

Main.exe 依赖于Subordinate.exe

这些项目都有App.config 文件,所以在它们各自的输出目录中,我有Main.exe.configSubordinate.exe.config

当我构建 Main.exe 时,Subordinate.exe 被复制到 Main 的输出目录中,但 Subordinate.exe.config 不是。

是否有标准方法告诉 Visual Studio 执行此操作?

【问题讨论】:

另一种方法是编辑父项目的 csproj 文件并使用属性组中的 AllowedReferenceRelatedFileExtensions。在您的情况下,您会将 .exe.config 添加到允许的扩展名列表中。见:***.com/questions/9765686/… 【参考方案1】:

我发现的另一种方法是将 app.config 文件作为链接文件添加到依赖项目中,例如在这里,您将在 Main.exe 的项目中添加一个指向 Subordinate.exe 的 app.config 的链接,并将其设置为在构建时复制到输出目录。然后,您可以通过编辑项目文件中的 <Link> 元素来更改在构建时复制到 Main.exe 输出目录的文件的名称,例如:

<None Include="..\Subordinate.ProjectFolder\app.config">
  <Link>Subordinate.exe.config</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

这与您必须对生成的配置文件的名称进行硬编码的问题相同,但这并不比AfterBuild 方法差,而且我发现这种方法更透明一些,并且它消除了构建顺序依赖性你提到的问题。

【讨论】:

有什么方法可以使文件显示为与链接相同的名称? 最佳解决方案,因为已接受的解决方案不适用于构建服务器方案 :)【参考方案2】:

右键单击Main 项目并选择Edit Project File。添加AfterBuild 事件:

  <Target Name="AfterBuild">
    <Copy SourceFiles="..\Subordinate\bin\$(Configuration)\Subordinate.exe.config" 
          DestinationFolder="$(TargetDir)" />
  </Target>

【讨论】:

我已经尝试过,使用PostBuildEvent,发现它在第一次尝试构建时失败,然后在第二次尝试中成功。结果在我的 real 项目中,从属项目没有被列为主项目的依赖项,因此它是在主项目之后构建的。一旦我正确地建立了依赖关系,构建后事件就会起作用。 -- 无论如何,我希望得到一个不需要 AfterBuild/PostBuildEvent 的答案,但鉴于没有即将到来的,我将其标记为答案(因为这是我所做的)。 我会不惜一切代价避免PostBuildEventAfterBuild 更可取,因为它至少是可控制的和可追溯的。 我想补充一点,在 VS2012 中,配置宏(例如 Debug/Release)是 $(ConfigurationName),而不是 $(Configuration)。此外,您可能需要包含平台规范(例如 x86/x64)。你可能最终需要这样写: 这有点乱,不是吗【参考方案3】:

看看this answer(基于@theyetiman 的工作)。它主要需要修改项目,app.config 文件所属。 消费项目保持不变。

<ItemGroup>
  <None Include="app.config" />
</ItemGroup>
<ItemGroup>
  <None Include="app.config">
    <Link>$(TargetFileName).config</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

另请注意,对于 Visual Studio 2017,此修改不再需要。如果您使用包含上述解决方法的项目打开解决方案,错误窗口中会显示类似于以下内容的警告:

无法将文件“app.config”添加到项目中。 无法添加指向文件 ...\app.config 的链接。 该文件位于项目目录树中。

添加比较$(VisualStudioVersion) 的条件以避免此警告并保持向后兼容性:

<ItemGroup>
  <None Include="app.config" />
</ItemGroup>
<ItemGroup Condition="'$(VisualStudioVersion)' &lt; '15.0'">
  <None Include="app.config">
    <Link>$(TargetFileName).config</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

【讨论】:

以上是关于子项目的 App.config 未复制到输出的主要内容,如果未能解决你的问题,请参考以下文章

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

VS/MSBUILD:复制子项目的输出文件,不添加对exe的引用

将 app.config 设置复制到 web.config 的替代方法?

app.config 是做啥用的?

如何在 C# 中配置 app.config 文件? [复制]

C#之app.configexe.config和vshost.exe.config作用区别