Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9360

.NET 5でPublishSingleFileを指定してビルドしたアプリの実行ディレクトリ

$
0
0

はじめに

この記事p:PublishSingleFileをtrueで作ったときに気づいたのですが、.NET 5では自己完結型アプリケーションでビルドしたアプリを実行した場合に実行ディレクトリが.NET Core 3.1の時と異なる&実行ファイルパスがAssembly.GetExecutingAssembly().Locationでは取得できませんでした。

この記事では.NET 5でPublishSingleFileを指定してビルドした自己完結型アプリケーションで、実行ディレクトリを取得する方法を確認します。

自己完結型アプリケーションの形式でアプリをビルドして、それぞれ実行する。

.NET 5および.NET Core 3.1のコンソールアプリケーションを作成し、それぞれメイン関数に下記のコードを記載します。

Program.cs
classProgram{staticvoidMain(string[]args){Console.WriteLine($"Environment.Version={Environment.Version}");Console.WriteLine($"Assembly.GetExecutingAssembly().Location={Assembly.GetExecutingAssembly().Location}");Console.WriteLine($"AppContext.BaseDirectory={AppContext.BaseDirectory}");Console.WriteLine("Hello World!");Console.ReadLine();}}

それぞれのプロジェクトを下記のコマンドラインでアプリを自己完結型アプリケーションでビルドします。

dotnet publish -c Release -r win-x64 /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true

実行したファイルをc:\tempにおいてからダブルクリックで実行したら下記の結果になりました。
image.png

ランタイムAssembly.GetExecutingAssembly().LocationAppContext.BaseDirectory
.NET 5C:\temp\sample\AppUsing5.exe
.NET Core 3.1%LOCALAPPDATA%\Temp.net\AppUsingCore3\dl4pjkfu.bol\AppUsingCore3.dllC:\temp\sample\AppUsingCore3.exe

.NET 5で実行ファイルのパスを求めるには?

単一ファイルの配置と実行可能ファイルにAPI の非互換性として、.NET 5で自己完結型アプリケーションでビルドした場合にAssembly.Locationでは空を返すとしっかり記載されていますね。また、Assembly.GetFileAssembly.CodeBaseでは例外を返すとも記載されています。

実行ファイルのディレクトリを参照する場合は、AppContext.BaseDirectoryを使うのが正しいようです。

自己完結型アプリケーションの実行ディレクトリ

.NET 3.1ではZIP形式の自己完結型アプリケーションは、一度%LOCALAPPDATA%に展開された後に展開された場所からプログラムが起動されます。このため実行ディレクトリを参照する場合にはAssembly.GetExecutingAssembly().Locationなどを確認する必要があったし、実行ファイルが存在するディレクトリを確認する場合はAppContext.BaseDirectoryを使うなどの使い分けが必要でした。

.NET 5では一時ディレクトリに展開されず、アプリが配置された場所から直に実行されるようになります。

まとめ

.NET 5になって実行パスの取得方法がわかりやすくなりましたね。
実行ファイルのパスの取得方法について、MSのドキュメントで触れられるのは初めてなんじゃないでしょうか


Viewing all articles
Browse latest Browse all 9360

Latest Images

Trending Articles