QA@IT

[C#] VisualStudioのビルドアクションについて

9847 PV

VSのビルドアクションの「なし」と「コンテンツ」についてです。

画像ファイルのビルドアクションに「コンテンツ」を指定して、XAMLでこのように画像ファイルを読み込んでいます。

<UserControl.Resources>
    <BitmapImage x:Key="icon" UriSource="pack://application:,,,/Resources/image.png" />
</UserControl.Resources>

ビルドアクションの「コンテンツ」はアセンブリにリソースを含まず外部にファイルを置くためのもので、「なし」はビルド時になにもしないものだと考えています。

これらの実際の処理の詳しいことを書いているページが見当たらないので探していたところ、外部にファイルを置くなら「なし」でもいいと書いてあるサイトをみかけました。

実行したときに指定のパスのファイルをロードするのであれば、「なし」にして、プログラム中に指定したファイルをビルドするフォルダにコピーする設定にするのでも、それ以前にVSではリソースを管理せずプログラムでパスだけ指定してビルド後に指定のパスにファイルを設置するのでも動くのでは?と思いました。

ですが、実際に試してみると「コンテンツ」を選んでいないとエラーになりました。

ビルドアクションはリソースファイルに対して設定するもので、XAMLなどURIを記述するところに書いてるわけでもないので、画像ファイルが「コンテンツ」でも「なし」でも動き変わらないのが普通だと思うのですが、どういう仕組みになっているのでしょうか?

回答

参考にするとすればこのあたりでしょうか。

1番目のリンクのコンテンツファイルの項にこうあります。

コンテンツ ファイルはコンパイルされてアセンブリに組み込まれるのではありませんが、アセンブリのコンパイル時に、各コンテンツ ファイルとの関連付けを確立するメタデータが使用されます。

アセンブリには組み込まれませんが、メタデータによってファイルと関連付けされます。

pack://application/// でエラーとなるのはそのメタデータが無いためです。
単に置いただけのファイルから取得した場合は
pack://siteoforigin:/// を使用してください

なので、コードを以下の様にすればビルドアクション「なし」でも動作するようになります。

<UserControl.Resources>
    <BitmapImage x:Key="image" UriSource="pack://siteoforigin:,,,/Resources/image.png" />
</UserControl.Resources>

※ 上記はimage.pngのビルドアクション「コンテンツ」でも動作しますが、実行アセンブリのパスを起点としているだけなのでビルドアクションは関係ありません。

編集 履歴 (0)
  • 遅くなりましたが、siteoforiginで無事解決しました。
    提示いただいたページは一応見ていたはずだったのですが、ちゃんと理解できてなかったようです。

    ありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。