2012-01-17 18 views
19

2つの実行可能プロジェクトを持つソリューションがあります。子プロジェクトのApp.configが出力にコピーされない

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://stackoverflow.com/questions/9765686/include-referenced-projects-config-file/9769667#9769667 –

答えて

10

Mainプロジェクトを右クリックし、Edit Project Fileを選択します。 AfterBuildイベントを追加:私が見つけ

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

私はすでに 'PostBuildEvent'を使ってこれを試していましたが、ビルドに失敗した、2回目の試行に成功しました。私の* real *プロジェクトでは、従属プロジェクトはメインプロジェクトの依存関係としてリストされていなかったので、メインプロジェクトの後にビルドされました。依存関係を正しく確立すると、ポストビルドイベントが機能しました。** - **とにかく、私はAfterBuild/PostBuildEventを必要としない答えを期待していましたが、何も来ていないことを考えれば、これを答えとしてマークしています。 – Mud

+1

私は 'PostBuildEvent'を絶対に避けたいと思います。 'AfterBuild'はビルド制御と追跡が可能なので望ましいです。 – KMoraz

+0

VS2012では、設定(Debug/Releaseなど)のマクロが$(Configuration)ではなく$(ConfigurationName)であることを追加したいと思います。 また、プラットフォーム仕様(x86/x64など)を含める必要がある場合もあります。 <対象名= "AfterBuild"> <コピーSourceFiles = ".. \下位\ bin \(プラットフォーム名)\ $(構成名)\ Subordinate.exe.configのように書く必要が生じることがあります。 " DestinationFolder =" $(TargetDir) "/> –

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

+0

受諾されたソリューションとしてのベストソリューションは、ビルドサーバーのシナリオでは機能しません:) – suryakiran

1

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> 
関連する問題