#はじめに
追記:こちらがとても詳しいことがわかりました。
僕が書いた記事はもしかしたら役に立つかもしれません( ;∀;)
Visual Studioでアプリケーションを作成するときに、アプリケーションにテキストファイルや画像ファイルなどいろいろなファイルを追加することがあります。
この時、それらのファイルのプロパティからビルドアクション
というものを指定することができます。
こちらで書いたように、追加したファイルにアクセスしたい場合にこのビルドアクション
をコンテンツ
にしたり埋め込みリソース
にしたりします。
しかし、このビルドアクションの選択肢はこれだけではなく、以下のとおり沢山あります。
- なし
- コンパイル
- コンテンツ
- 埋め込みリソース
- AdditionalFiles
- CodeAnalysisDictionary
- ApplicationDefinition
- Page
- Resource
- SplashScreen
- DesignData
- DesignDataWithDesignTimeCreatableTypes
- EntityDeploy
- XamlAppDef
特に埋め込みリソース
とResource
の違いがわかりません。
#ググってみました
するとこちらに同じ疑問を抱く方がいまして、その疑問に対して回答している方がいました。
それによると。
- なし:このファイルはプロジェクトのアウトプットグループに含まれず、また、ビルドプロセスにおいてコンパイルもされません。ReadMeファイルのようなテキストファイルがそれにあたります。
- コンパイル:このファイルはビルドによる出力に含まれます。この設定はコードファイルに使われます。
- 埋め込みリソース:ファイルをアセンブリ・マニフェスト・リソースの中に埋め込みます。
-
Resource:WPFのみ。
AppName.g.resources
という名前の共有アセンブリ・マニフェスト・リソース内に埋め込まれる。 -
Page:WPFのみ。
xaml
ファイルをbaml
にコンパイルするために使われる。baml
とはResource
と同じ方法で埋め込まれる(例:AppName.g.resources
)。 -
ApplicationDefinition:WPFのみ。あなたのアプリケーションを定義する
XAML/class
ファイルを表します。x:Class="Namespace.ClassName"
でコードビハインドを特定し、StartupUri=”Window1.xaml”
でエントリポイントとなるFormやPageを設定します。 -
SplashScreen:WPFのみ。
SplashScreen
と指定された画像は、WPFアプリケーションがロードされるときに自動的に表示され、(ロードが終わると)消えます。 - DesignData:Visual Studio上でユーザーコントロールがサンプルデータとともにプレビューできるようにXAMLビューモデルをコンパイルします。(モックの型を使用)
- DesignDataWithDesignTimeCreatableTypes:Visual Studio上でユーザーコントロールがサンプルデータとともにプレビューできるようにXAMLをコンパイルします。(実際の型を使用)https://blogs.msdn.microsoft.com/mcsuksoldev/2010/08/27/designdata-mvvm-support-in-blend-vs2010-and-wpfsilverlight/
- EntityDeploy:エンティティ・フレームワーク。エンティティ・フレームワークのアーティファクトをデプロイするために使用される。https://msdn.microsoft.com/en-us/library/microsoft.data.entity.build.tasks.entitydeploy.aspx?f=255&MSPPError=-2147217396
- CodeAnalysisDictionary:カスタム・ワード・ディクショナリを含むXMLファイル。https://blogs.msdn.microsoft.com/codeanalysis/2007/08/20/new-for-visual-studio-2008-custom-dictionaries/
はい、だんだん翻訳が怪しくなっていきました。
率直に申し上げて、DesignData
から下がさっぱりわかりませんでした。
#でも、わかったこともあります
一番わかりやすいのはSplashScreen
ですね。
このビルドアクションを選択した画像ファイルは、アプリケーションの起動時にスプラッシュスクリーンとして表示されます。
コンパイル
がついているファイルは文字通りコンパイルされます。
.cs
がついたクラスファイルがそれにあたります。
例えばMainWindow.xaml.cs
のプロパティをみてみると、ビルドアクション
がコンパイル
になっていることがわかります。
そして、コンパイルされたくないもの、する必要がなくなったものはなし
を選択するということですね。
埋め込みリソース
を指定すると、そのファイルがリソースとしてアセンブリに埋め込まれ、実行時にアクセスすることができます。おそらくですが、exeやdllの中にバイナリとして埋め込まれるので、ファイルとしてユーザーの目に触れることはないでしょう。
Resource
は例えばテキストファイルを追加したとき、そのビルドアクションがデフォルトでResourceになっています。説明によればAppName.g.resourcesファイルの中に埋め込まれるとのことですが、このファイルがどこにあるかというと、以下のフォルダの中にあります。
ソリューションフォルダ\ソリューション名\obj\debug\ソリューション名.g.resources
このファイルはバイナリファイルなので、Resourceと設定されたファイルがバイナリデータとしてここに埋め込まれているということかなと。
となれば実行時に埋め込まれたファイルにアクセスする方法もきっとあるはずです。
Page
となっているのはMainWindow.xamlなどのXAMLファイルですね。
さて、リンク先にはコンテンツ
に触れられていなかったので、僕なりの理解を書きますと、コンテンツ
に設定されたファイルは埋め込みリソース
やResource
と違って、アセンブリに含まれません。じゃあどうなるかというと、インストール時にファイルがインストール先のフォルダに配置されます。
ですので、インストール先のフォルダからそのファイルまでのパスをたどれば、通常のファイルアクセスのやり方で読み書きができます。
#おわりに
今までビルドアクションがなんだかわからないまま何となくアプリを作ってきましたが、こうして自分なりに調べてみると、自分にとって必要な項目がわかってきて、もやもやが解消されました。
Visual Studioで開発を行っている場合、ほとんどの場合、Visual Studioがデフォルトで設定してくれるビルドアクションで問題ないと思います。
ファイルを追加した場合のみ、それをバイナリとしてアセンブリに含めるか(埋め込みリソース、Resource)、インストール先のフォルダにそのまま配置するか(コンテンツ)で設定を適宜変更する機会があるかと思います。
この3つのビルドアクションはそれぞれファイルへのアクセスの仕方が異なるのでそれについては、順次投稿していきます。
#追記
ビルドアクションをResource
にしたときのファイルへのアクセス方法について書きました。こちら。