プロジェクトの中に静的ファイルとしてjsonなどのデータを含めた場合、実行ファイルがそれらのファイルにアクセスする際の相対パスがややこしくなります。
よくある例が、ビルドの構成でデフォルトでは
ProjectFolderPath/bin/Debug/MyApp.exe
に実行ファイルが生成されるのに対し、プラットフォームをx64などにすると、
ProjectFolderPath/bin/ x64 /Debug/MyApp.exe
に実行ファイルが生成されます。この場合、
var pathToJson = "../../../static/hoge.json"
と定義しても、ビルドの構成を変えたときに正しく静的ファイルにアクセスすることができません。
しかし、Enivironmentクラスを見てもProjectFolderへのパスを取得できなさそうです。
そこで、ビルド前にコマンドを実行し、ProjectFolderのパスをファイルとして出力するようにします。
1.まずはプロジェクトのプロパティを開き、ビルドイベントタブを選択します。
2.次に「ビルド前の編集」ボタンを押します。
3.「マクロ>>」を押します。
4.ビルド前に実行するコマンドラインとして、
ECHO $(ProjectDir) > $(TargetDir)ProjectDirPath.txt
を設定します。
5.あとは、ビルド時に実行ファイルと同じ階層に"ProjectDirPath.txt"が生成されるので、そこからProjectFolderへのパスを取得します。
string projectDirPath;
if(File.Exists("ProjectDirPath.txt")){
using(var sr = new StreamReader("ProjectDirPath.txt")){
projectDirPath = sr.ReadToEnd();
}
}
var pathToJson = Path.Combine(projectDirPath, "static", "hoge.json");
ビルド前およびビルド後のコマンドライン実行は、使い方次第でかなり便利なことができるので、ガンガン使いましょう。