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

21

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

Main.exe 依赖于 Subordinate.exe

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

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

是否有一种标准方法来告诉 Visual Studio 这样做呢?


2
另一种方法是编辑父项目的csproj文件,并在propertygroup中使用AllowedReferenceRelatedFileExtensions。在您的情况下,您将把.exe.config添加到允许扩展名列表中。请参见:https://dev59.com/RWkw5IYBdhLWcg3wm74h#9769667 - Daniel Lee
3个回答

14

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

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

这个方法也存在硬编码生成配置文件名称的问题,但这并不比使用AfterBuild方式更糟,并且我发现这种方法更加透明,它还解决了你提到的构建依赖性问题。


1
有没有办法让文件的名称与链接的名称相同呢? - Zee
最佳解决方案,因为被接受的解决方案在构建服务器场景下不起作用 :) - suryakiran

11

右键点击Main项目,选择Edit Project File。添加一个AfterBuild事件:

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

我已经尝试过使用PostBuildEvent,发现第一次构建失败,第二次才成功。原来在我的真实项目中,从属项目未被列为主项目的依赖项,因此在主项目之后构建。一旦我正确地建立了依赖关系,后置构建事件就可以工作了。**--**总之,我希望能有一个不需要AfterBuild/PostBuildEvent的答案,但考虑到没有人提供这样的答案,我将其标记为答案(因为这就是我所做的)。 - Mud
1
我会尽量避免使用 PostBuildEventAfterBuild 更可取,因为它至少是由构建控制和可追踪的。 - KMoraz
我想补充一下,在VS2012中,配置(例如Debug/Release)的宏是$(ConfigurationName),而不是$(Configuration)。此外,您可能需要包括平台规范(例如x86/x64)。您最终可能需要编写类似以下的代码:<Target Name="AfterBuild"> <Copy SourceFiles="..\Subordinate\bin$(PlatformName)$(ConfigurationName)\Subordinate.exe.config" DestinationFolder="$(TargetDir)" /> </Target> - Aaron Hudon
这有点拙劣,不是吗? - Alexey Kozhanov

2
请查看这个答案(基于@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>

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