子项目的 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.config
和Subordinate.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 的答案,但鉴于没有即将到来的,我将其标记为答案(因为这是我所做的)。
我会不惜一切代价避免PostBuildEvent
。 AfterBuild
更可取,因为它至少是可控制的和可追溯的。
我想补充一点,在 VS2012 中,配置宏(例如 Debug/Release)是 $(ConfigurationName),而不是 $(Configuration)。此外,您可能需要包含平台规范(例如 x86/x64)。你可能最终需要这样写: 看看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)' < '15.0'">
<None Include="app.config">
<Link>$(TargetFileName).config</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
【讨论】:
以上是关于子项目的 App.config 未复制到输出的主要内容,如果未能解决你的问题,请参考以下文章
VS/MSBUILD:复制子项目的输出文件,不添加对exe的引用
将 app.config 设置复制到 web.config 的替代方法?