shuhelohelo’s blog

Xamarin.Forms多めです.

Visual Studioでファイルの「ビルドアクション」って何なの?[引越記事]

はじめに

追記:こちらがとても詳しいことがわかりました。

僕が書いた記事はもしかしたら役に立つかもしれません( ;∀;)

Visual Studioでアプリケーションを作成するときに、アプリケーションにテキストファイルや画像ファイルなどいろいろなファイルを追加することがあります。 この時、それらのファイルのプロパティからビルドアクションというものを指定することができます。

clipboard_20181012193953.png

こちらで書いたように、追加したファイルにアクセスしたい場合にこのビルドアクションコンテンツにしたり埋め込みリソースにしたりします。

しかし、このビルドアクションの選択肢はこれだけではなく、以下のとおり沢山あります。

  • なし
  • コンパイル
  • コンテンツ
  • 埋め込みリソース
  • AdditionalFiles
  • CodeAnalysisDictionary
  • ApplicationDefinition
  • Page
  • Resource
  • SplashScreen
  • DesignData
  • DesignDataWithDesignTimeCreatableTypes
  • EntityDeploy
  • XamlAppDef

特に埋め込みリソースResourceの違いがわかりません。

ググってみました

するとこちらに同じ疑問を抱く方がいまして、その疑問に対して回答している方がいました。

それによると。

はい、だんだん翻訳が怪しくなっていきました。 率直に申し上げて、DesignDataから下がさっぱりわかりませんでした。

でも、わかったこともあります

一番わかりやすいのはSplashScreenですね。 このビルドアクションを選択した画像ファイルは、アプリケーションの起動時にスプラッシュスクリーンとして表示されます。

コンパイルがついているファイルは文字通りコンパイルされます。 .csがついたクラスファイルがそれにあたります。 例えばMainWindow.xaml.csのプロパティをみてみると、ビルドアクションコンパイルになっていることがわかります。 clipboard_20181013210348.png そして、コンパイルされたくないもの、する必要がなくなったものはなしを選択するということですね。

埋め込みリソースを指定すると、そのファイルがリソースとしてアセンブリに埋め込まれ、実行時にアクセスすることができます。おそらくですが、exeやdllの中にバイナリとして埋め込まれるので、ファイルとしてユーザーの目に触れることはないでしょう。

Resourceは例えばテキストファイルを追加したとき、そのビルドアクションがデフォルトでResourceになっています。説明によればAppName.g.resourcesファイルの中に埋め込まれるとのことですが、このファイルがどこにあるかというと、以下のフォルダの中にあります。

ソリューションフォルダ\ソリューション名\obj\debug\ソリューション名.g.resources

このファイルはバイナリファイルなので、Resourceと設定されたファイルがバイナリデータとしてここに埋め込まれているということかなと。 となれば実行時に埋め込まれたファイルにアクセスする方法もきっとあるはずです。

PageとなっているのはMainWindow.xamlなどのXAMLファイルですね。

さて、リンク先にはコンテンツに触れられていなかったので、僕なりの理解を書きますと、コンテンツに設定されたファイルは埋め込みリソースResourceと違って、アセンブリに含まれません。じゃあどうなるかというと、インストール時にファイルがインストール先のフォルダに配置されます。 ですので、インストール先のフォルダからそのファイルまでのパスをたどれば、通常のファイルアクセスのやり方で読み書きができます。

おわりに

今までビルドアクションがなんだかわからないまま何となくアプリを作ってきましたが、こうして自分なりに調べてみると、自分にとって必要な項目がわかってきて、もやもやが解消されました。

Visual Studioで開発を行っている場合、ほとんどの場合、Visual Studioがデフォルトで設定してくれるビルドアクションで問題ないと思います。

ファイルを追加した場合のみ、それをバイナリとしてアセンブリに含めるか(埋め込みリソース、Resource)、インストール先のフォルダにそのまま配置するか(コンテンツ)で設定を適宜変更する機会があるかと思います。 この3つのビルドアクションはそれぞれファイルへのアクセスの仕方が異なるのでそれについては、順次投稿していきます。

追記

ビルドアクションをResourceにしたときのファイルへのアクセス方法について書きました。こちら