M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

JP1/AJSから実行すると*.exe.configが読み取れないケースがある

JP1/AJSから.NET Frameworkのコンソールアプリを実行したときに起こることがある事象についてです。今のところ、なぜこれが起こるのかわかっていません。したがってこれが.NET Frameworkの問題なのか、当該アプリ固有の問題なのか、それともJP1/AJSの問題なのか、あるいはそれ以外なのかはわかりません。そういうわけで、どうしたら事象を解消できるのかも分かっていません。 その後、原因がわかりました。JP1/AJS2の仕様でした(2017/06/23追記)。

事象

JP1/AJSのPCジョブで.NET Frameworkのコンソールアプリの*.exeを実行するとき、*.exe.configが読み取れない。

読み取りにあたって何か例外がスローされるわけではない。ファイルがそもそも存在していない扱いとなり、ConfigurationManager.AppSettingsプロパティが返すNameValueCollectionの内容が空の状態となる。

環境情報

OS Windows Server 2008 R2
AJS JP1/AJS3 Agentサービスを利用。ただし別サーバで稼働するManagerサービスはJP1/AJS2。Agent/Managerのバージョン差異については、当該環境構築したおりHITACHIのサポートより問題ない旨の回答を得ている。
.NET .NET Framework v4.5.2

表面的な原因

この事象が発生しているとき、Assembly.GetEntryAssembly().Locationプロパティが返すアセンブリのパスが「*.exeの配置されたディレクトリのパス+ "\" + *.exeのベースネーム("*"部分)の先頭6文字の大文字表記 + "~1.exe"」という値になっている。

つまりもし*.exeが "C:\path\to\SampleApp.exe" である場合、上述のプロパティが返す値は "C:\path\to\SAMPLE~1.exe" となる。
このため本来のアプリケーション構成ファイル "SampleApp.exe.config" の内容はそのままに、名称を "SAMPLE~1.exe.config" としたものを用意しておくと、この内容が読み込まれて、ConfigurationManager.AppSettingsプロパティが返すコレクションのエントリーとしてプログラム側から参照できる。

根本的な原因

今のところ不明。
同様の構成(環境情報のセクションを参照のこと)で稼働するアプリでこの事象を発現しているものは今のところ見つかっていないため、PCジョブの設定もしくは*.exe自体に原因がある可能性が高いが、突き止められていない。
前述の通り、この記事を書いたあと、原因がわかりました。JP1/AJS2の仕様でした。JP1/AJS2は基本的にPCジョブの実行ファイル名をショートファイル名に変換してしまうのです(2017/06/23追記)。