プログラム 技術

.Netで実行パスを取得する

.Net 8で実行パスを取得しようとしたところ.NetFrameworkとは若干違いがあったのでメモしておきます

System.Windows.Formsが使えない

System.Windows.Formsに含まれる【Application.ExecutablePath】が使えなかったので、調べてみたら色々なやり方がありました

// 出力結果:D:\work\CSharpTest\bin\Debug\net8.0\CSharpTest.dll
Assembly.GetEntryAssembly().Location;

// 出力結果:file:\D:\work\CSharpTest\bin\Debug\net8.0
Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);

// 出力結果:D:\work\CSharpTest\bin\Debug\net8.0\
AppDomain.CurrentDomain.BaseDirectory;

// 出力結果:D:\work\CSharpTest\bin\Debug\net8.0
Directory.GetCurrentDirectory();

// 出力結果:D:\work\CSharpTest\bin\Debug\net8.0
Directory.GetParent(Assembly.GetExecutingAssembly().Location);

// 出力結果:D:\work\CSharpTest\bin\Debug\net8.0
Environment.CurrentDirectory;

// 出力結果:D:\work\CSharpTest\bin\Debug\net8.0 
Path.GetDirectoryName(Path.GetFullPath(Environment.GetCommandLineArgs()[0]));

// 出力結果:D:\work\CSharpTest\bin\Debug\net8.0
Path.GetDirectoryName(Environment.ProcessPath)

上記のコードをビルドしてExeファイルを他の階層に移動させて実行してみます

// 出力結果:D:\net8.0\CSharpTest.dll
Assembly.GetEntryAssembly().Location;

// 出力結果:file:\D:\net8.0
Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);

// 出力結果:D:\net8.0\
AppDomain.CurrentDomain.BaseDirectory;

// 出力結果:D:\net8.0
Directory.GetCurrentDirectory();

// 出力結果:D:\net8.0
Directory.GetParent(Assembly.GetExecutingAssembly().Location);

// 出力結果:D:\net8.0
Environment.CurrentDirectory;

// 出力結果:D:\net8.0 
Path.GetDirectoryName(Path.GetFullPath(Environment.GetCommandLineArgs()[0]));

// 出力結果:D:\net8.0
Path.GetDirectoryName(Environment.ProcessPath)

上記のようにコードは違いますが、結果は変わらないものがいくつかありました。具体的に何が違うのかよくわからなかったのですが、以下のサイトだと【AppDomain.CurrentDomain.BaseDirectry】が妥当だそうです

参考サイト
【.Net】アプリのパスを取得する方法っていくつもあるけど何か違うの?【C#】 | ドクロモエ
【.Net】アプリのパスを取得する方法っていくつもあるけど何か違うの?【C#】 | ドクロモエ

続きを読む

-プログラム, 技術
-