redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

Visual Studioのファイルのプロパティのビルド アクションの「コンテンツ」と「なし」の違い

Visual Studioの ファイルのプロパティ のビルド アクションの値で「コンテンツ」と「なし」の違いを調べました。

Visual Studio上でファイルを選択して ファイルのプロパティ に表示される項目のうち、出力ディレクトリにコピー は、値を「常にコピーする」か「新しい場合はコピーする」にすると、選択したファイルが出力ディレクトリにコピーされるので、何を意味するかは明確です。

一方、ビルド アクションは、公式サイトに説明があり、これを読むと「コンテンツ」は何となくわかった気になりますが、

docs.microsoft.com

「なし」の項目には、以下のように書かれています。

ファイルはいかなる形でもビルドに含まれません。 この値は、"ReadMe" ファイルなどのドキュメント ファイルで使用できます。

「なし」はビルドに含まれないと書いてあるのに、出力ディレクトリにコピー を適切に設定していれば、出力ディレクトリにコピーされます。

ビルド アクション は「コンテンツ」した方が良いのか、「なし」のままでが良いのか疑問に思っていました。

よくわからないので、「コンテンツ」の説明にあるリンクを辿っていくと以下のサイトに情報がありました。

docs.microsoft.com

かいつまんで書くと、

「コンテンツ」は、アセンブリには含まれないけど、ビルド時にアセンブリと関連付けることができる。アセンブリとは独立しているので、個別に更新をすることができる。ビルド時にファイルが必要。XAMLからはファイル名のみで簡単に参照できる。

「なし」は、Site of Origin Filesと呼ばれるタイプを設定する方法。Site of Origin Filesは、アセンブリと関連のないファイルで、実行時に参照したい場合に使用する。こちらも個別に更新をすることができる。XAMLからはPack URI形式で参照できる。ビルド時に存在しないファイルを参照したり、URLで参照することができる。

どう使えば良いのか

XAMLで使うかどうかが判断基準になりそうです。ビルド時にプロジェクトに存在している背景やアイコン等の画像系は「コンテンツ」に設定します。

一方、XAMLで使用する事がないEXEファイルやインストーラは「なし」に設定するのが良さそうです。

検証してみた

実際に、XAMLでImageタグを2つ用意し、ビルド アクションを「コンテンツ」にした画像と、「なし」にした画像のファイル名をそれぞれ指定すると、Visual Studioのデザイナーでは両方とも表示されますが、 デバッグ実行すると、「コンテンツ」にした画像は表示され、「なし」にした画像は表示されませんでした。

確認環境

以上