Net coreで現在のパスを取得するためのさまざまな方法のテスト
.Net Core取得プログラムの現在のパス
テスト環境
主なペアNet Coreの下のいくつかのファイルを取得する方式はテストを行い、環境をテストする.Net Standard 2.0クラスライブラリClassLibrary 1.Net Core 3.1コンソールプログラムLinuxPathTest
パブリケーションはlinux-x 64とwin-x 64のそれぞれにパッケージされています.
テストコード
ClassLibrary1 using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
namespace ClassLibrary1
{
public class Library: IEnumerable<string>
{
public IEnumerator<string> GetEnumerator()
{
yield return $"{Environment.CurrentDirectory}";
yield return $"{Directory.GetCurrentDirectory()}";
yield return $"{GetType().Assembly.Location}";
yield return $"{Process.GetCurrentProcess().MainModule.FileName}";
yield return $"{AppDomain.CurrentDomain.BaseDirectory}";
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}
LinuxPathTest using ClassLibrary1;
using System;
using System.Diagnostics;
using System.IO;
namespace LinuxPathTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("-------------------------------");
foreach (var item in new Library())
{
Console.WriteLine($"{item}");
}
Console.WriteLine("-------------------------------");
Console.WriteLine($"{Environment.CurrentDirectory}");
Console.WriteLine($"{Directory.GetCurrentDirectory()}");
Console.WriteLine($"{(new object()).GetType().Assembly.Location}");
Console.WriteLine($"{Process.GetCurrentProcess().MainModule.FileName}");
Console.WriteLine($"{AppDomain.CurrentDomain.BaseDirectory}");
Console.WriteLine($"{AppDomain.CurrentDomain.SetupInformation.ApplicationBase}"); // .net standard
Console.ReadLine();
}
}
}
しゅつりょく
win-x64
実行可能ファイルのパスE:ProjectsLinuxPathTestLinuxPathTestbinReleaseetcoreap 3.1\publish -------------------------------
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\ClassLibrary1.dll
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish\LinuxPathTest.exe
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\
-------------------------------
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\System.Private.CoreLib.dll
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish\LinuxPathTest.exe
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\
linux-64
実行可能ファイルパス/home/ユーザー名/desktop/Test-------------------------------
/home/ /Desktop/Test
/home/ /Desktop/Test
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/ClassLibrary1.dll
/home/ /Desktop/Test/LinuxPathTest
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/
-------------------------------
/home/ /Desktop/Test
/home/ /Desktop/Test
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/System.Private.CoreLib.dll
/home/ /Desktop/Test/LinuxPathTest
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/
まとめ
.Net Coreがホストから無依存の単一ファイルにパッケージ化された後、ファイルを一時ファイルに解放する操作がさらに多くなるため、ファイルパスを取得する方法によって得られる結果と.Net Frameworkでは一致しません.
ClassLibrary1
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
namespace ClassLibrary1
{
public class Library: IEnumerable<string>
{
public IEnumerator<string> GetEnumerator()
{
yield return $"{Environment.CurrentDirectory}";
yield return $"{Directory.GetCurrentDirectory()}";
yield return $"{GetType().Assembly.Location}";
yield return $"{Process.GetCurrentProcess().MainModule.FileName}";
yield return $"{AppDomain.CurrentDomain.BaseDirectory}";
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}
LinuxPathTest
using ClassLibrary1;
using System;
using System.Diagnostics;
using System.IO;
namespace LinuxPathTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("-------------------------------");
foreach (var item in new Library())
{
Console.WriteLine($"{item}");
}
Console.WriteLine("-------------------------------");
Console.WriteLine($"{Environment.CurrentDirectory}");
Console.WriteLine($"{Directory.GetCurrentDirectory()}");
Console.WriteLine($"{(new object()).GetType().Assembly.Location}");
Console.WriteLine($"{Process.GetCurrentProcess().MainModule.FileName}");
Console.WriteLine($"{AppDomain.CurrentDomain.BaseDirectory}");
Console.WriteLine($"{AppDomain.CurrentDomain.SetupInformation.ApplicationBase}"); // .net standard
Console.ReadLine();
}
}
}
しゅつりょく
win-x64
実行可能ファイルのパスE:ProjectsLinuxPathTestLinuxPathTestbinReleaseetcoreap 3.1\publish -------------------------------
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\ClassLibrary1.dll
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish\LinuxPathTest.exe
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\
-------------------------------
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\System.Private.CoreLib.dll
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish\LinuxPathTest.exe
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\
linux-64
実行可能ファイルパス/home/ユーザー名/desktop/Test-------------------------------
/home/ /Desktop/Test
/home/ /Desktop/Test
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/ClassLibrary1.dll
/home/ /Desktop/Test/LinuxPathTest
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/
-------------------------------
/home/ /Desktop/Test
/home/ /Desktop/Test
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/System.Private.CoreLib.dll
/home/ /Desktop/Test/LinuxPathTest
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/
まとめ
.Net Coreがホストから無依存の単一ファイルにパッケージ化された後、ファイルを一時ファイルに解放する操作がさらに多くなるため、ファイルパスを取得する方法によって得られる結果と.Net Frameworkでは一致しません.
-------------------------------
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\ClassLibrary1.dll
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish\LinuxPathTest.exe
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\
-------------------------------
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\System.Private.CoreLib.dll
E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
etcoreapp3.1\publish\LinuxPathTest.exe
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\
C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\
-------------------------------
/home/ /Desktop/Test
/home/ /Desktop/Test
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/ClassLibrary1.dll
/home/ /Desktop/Test/LinuxPathTest
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/
-------------------------------
/home/ /Desktop/Test
/home/ /Desktop/Test
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/System.Private.CoreLib.dll
/home/ /Desktop/Test/LinuxPathTest
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/
/var/tmp/.net/LinuxPathTest/5kkarywl.a5s/
.Net Coreがホストから無依存の単一ファイルにパッケージ化された後、ファイルを一時ファイルに解放する操作がさらに多くなるため、ファイルパスを取得する方法によって得られる結果と.Net Frameworkでは一致しません.