自プロセス・アセンブリの情報
カレントディレクトリ
プロセスの現在のカレントディレクトリ(作業フォルダ)を取得するには、Environment.CurrentDirectoryプロパティを参照するかDirectory.GetCurrentDirectoryメソッドを呼び出します。 両者の違いはプロパティかメソッドかという点のみで、取得できる結果は同じです。
また、カレントディレクトリを設定するには、Environment.CurrentDirectoryプロパティに新しい値を設定するか、Directory.SetCurrentDirectoryメソッドを使って設定します。 なお、存在しないディレクトリをカレントディレクトリにしようとした場合、DirectoryNotFoundExceptionがスローされる点に注意が必要です。
using System;
using System.IO;
class Sample {
static void Main()
{
// カレントディレクトリを取得・表示
Console.WriteLine(Environment.CurrentDirectory);
Console.WriteLine(Directory.GetCurrentDirectory());
Console.WriteLine();
// 新しいカレントディレクトリのパスを作成
string currdir = Environment.CurrentDirectory;
string workdir = Path.Combine(currdir, "workdir");
// ディレクトリを作成
Directory.CreateDirectory(workdir);
// カレントディレクトリを作成したディレクトリに変更
Environment.CurrentDirectory = workdir;
// 変更後のカレントディレクトリを取得・表示
Console.WriteLine(Directory.GetCurrentDirectory());
// カレントディレクトリを元に戻す
Directory.SetCurrentDirectory(currdir);
// 作成したディレクトリを削除
Directory.Delete(workdir);
}
}
Imports System
Imports System.IO
Class Sample
Shared Sub Main()
' カレントディレクトリを取得・表示
Console.WriteLine(Environment.CurrentDirectory)
Console.WriteLine(Directory.GetCurrentDirectory())
Console.WriteLine()
' 新しいカレントディレクトリのパスを作成
Dim currdir As String = Environment.CurrentDirectory
Dim workdir As String = Path.Combine(currdir, "workdir")
' ディレクトリを作成
Directory.CreateDirectory(workdir)
' カレントディレクトリを作成したディレクトリに変更
Environment.CurrentDirectory = workdir
' 変更後のカレントディレクトリを取得・表示
Console.WriteLine(Directory.GetCurrentDirectory())
' カレントディレクトリを元に戻す
Directory.SetCurrentDirectory(currdir)
' 作成したディレクトリを削除
Directory.Delete(workdir)
End Sub
End Class
E:\ E:\ E:\workdir
環境変数
環境変数の取得・設定ついては環境変数で個別に解説しています。
現在実行中のアセンブリ
Assembly.GetExecutingAssemblyメソッドを使うことで現在実行しているコードのあるアセンブリを取得することが出来ます。 ここからさらに、アセンブリの情報について調べることが出来ます。
using System;
using System.Reflection;
class Sample {
static void Main()
{
// 現在実行しているアセンブリを取得する
Assembly assm = Assembly.GetExecutingAssembly();
Console.WriteLine(assm.FullName); // アセンブリの表示名
Console.WriteLine(assm.Location); // アセンブリの場所(パス)
}
}
Imports System
Imports System.Reflection
Class Sample
Shared Sub Main()
' 現在実行しているアセンブリを取得する
Dim assm As [Assembly] = [Assembly].GetExecutingAssembly()
Console.WriteLine(assm.FullName) ' アセンブリの表示名
Console.WriteLine(assm.Location) ' アセンブリの場所(パス)
End Sub
End Class
sample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null E:/sample.exe
sample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null /home/smdn/sample.exe
この他にも、Assembly.GetEntryAssemblyメソッドでエントリーポイント(Mainメソッド)を含むアセンブリ、Assembly.GetCallingAssemblyメソッドで現在実行中のメソッドを呼び出したアセンブリを取得することができます。 アセンブリの取得方法についてはリフレクション §.アセンブリの取得を参照してください。
ターゲットのランタイムバージョン
アセンブリをビルドしたときのランタイムバージョンを取得するには、Assembly.ImageRuntimeVersionプロパティを参照します。 このプロパティで取得できるバージョンは文字列で、形式はRuntimeEnvironment.GetSystemVersionメソッドの戻り値と同様です。
using System;
using System.Reflection;
class Sample {
static void Main()
{
// 現在実行しているアセンブリを取得する
Assembly assm = Assembly.GetExecutingAssembly();
// アセンブリのターゲットとなるランタイムバージョンを取得・表示する
Console.WriteLine(assm.ImageRuntimeVersion);
// 現在動作しているランタイムのバージョンを取得・表示する
Console.WriteLine(Environment.Version);
}
}
Imports System
Imports System.Reflection
Class Sample
Shared Sub Main()
' 現在実行しているアセンブリを取得する
Dim assm As [Assembly] = [Assembly].GetExecutingAssembly()
' アセンブリのターゲットとなるランタイムバージョンを取得・表示する
Console.WriteLine(assm.ImageRuntimeVersion)
' 現在動作しているランタイムのバージョンを取得・表示する
Console.WriteLine(Environment.Version)
End Sub
End Class
v4.0.30319 4.0.30319.1
参照アセンブリ
あるアセンブリが参照しているアセンブリを取得するにはAssembly.GetReferencedAssembliesメソッドを使うことができます。
using System;
using System.Reflection;
class Sample {
static void Main()
{
// 現在実行しているアセンブリを取得する
Assembly assm = Assembly.GetExecutingAssembly();
Console.WriteLine(assm.FullName);
// 参照しているすべてのアセンブリを取得し、表示する
foreach (AssemblyName refassm in assm.GetReferencedAssemblies()) {
Console.WriteLine(" {0}", refassm.FullName);
}
}
}
// 他のアセンブリを参照するコードを含むクラス
class Foo {
void Bar()
{
// System.dllを必要とするコード
new System.Collections.Generic.Queue<int>();
}
void Baz()
{
// System.Core.dllを必要とするコード
System.Linq.Enumerable.Range(0, 1);
}
}
Imports System
Imports System.Reflection
Class Sample
Shared Sub Main()
' 現在実行しているアセンブリを取得する
Dim assm As [Assembly] = [Assembly].GetExecutingAssembly()
Console.WriteLine(assm.FullName)
' 参照しているすべてのアセンブリを取得し、表示する
For Each refassm As AssemblyName In assm.GetReferencedAssemblies()
Console.WriteLine(" {0}", refassm.FullName)
Next
End Sub
End Class
' 他のアセンブリを参照するコードを含むクラス
Class Foo
Sub Bar()
' System.dllを必要とするコード
Dim q As New System.Collections.Generic.Queue(Of Integer)()
End Sub
Sub Baz()
' System.Core.dllを必要とするコード
System.Linq.Enumerable.Range(0, 1)
End Sub
End Class
sample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
コマンドライン引数
現在のプロセスを起動したときのコマンドライン引数を取得するには、Mainメソッドでコマンドライン引数を受け取る文字列配列指定します。
using System;
class Sample {
// Mainメソッドにコマンドライン引数を格納するための引数を用意する
static void Main(string[] args)
{
// プロセス起動時に指定されたコマンドライン引数を表示する
foreach (string arg in args) {
Console.WriteLine(arg);
}
}
}
Imports System
Class Sample
' Mainメソッドにコマンドライン引数を格納するための引数を用意する
Shared Sub Main(ByVal args As String())
' プロセス起動時に指定されたコマンドライン引数を表示する
For Each arg As String In args
Console.WriteLine(arg)
Next
End Sub
End Class
E:\>csc sample.cs E:\>sample.exe /foo /bar=baz "hoge moge" /foo /bar=baz hoge moge
$dmcs sample.cs $mono sample.exe /foo /bar=baz "hoge moge" /foo /bar=baz hoge moge
これとは別にEnvironment.GetCommandlineArgsメソッドを使うことも出来ます。 Mainメソッドで引数を用意する場合と異なる点は、このメソッドを使うことで任意の箇所でコマンドライン引数を参照できることと、このメソッドで取得できるコマンドライン引数の先頭には実行可能ファイルの名前が格納されることの2点です。
また、Environment.CommandLineプロパティを参照すると、配列に分割される前のコマンドライン文字列を取得することが出来ます。
using System;
class Sample {
static void Main()
{
// プロセス起動時に指定されたコマンドラインを取得・表示する
Console.WriteLine(Environment.CommandLine);
// プロセス起動時に指定されたコマンドライン引数を表示する
foreach (string arg in Environment.GetCommandLineArgs()) {
Console.WriteLine(arg);
}
}
}
Imports System
Class Sample
Shared Sub Main()
' プロセス起動時に指定されたコマンドラインを取得・表示する
Console.WriteLine(Environment.CommandLine)
' プロセス起動時に指定されたコマンドライン引数を表示する
For Each arg As String In Environment.GetCommandLineArgs()
Console.WriteLine(arg)
Next
End Sub
End Class
E:\>csc sample.cs E:\>sample.exe /foo /bar=baz "hoge moge" sample.exe /foo /bar=baz "hoge moge" sample.exe /foo /bar=baz hoge moge
$dmcs sample.cs $mono sample.exe /foo /bar=baz "hoge moge" /home/smdn/sample.exe /foo /bar=baz "hoge moge" /home/smdn/sample.exe /foo /bar=baz hoge moge
自プロセスのパス
自分自身のプロセス(現在実行している実行可能ファイル)のパスを取得するには、Assembly.GetEntryAssemblyメソッドで実行可能ファイルのアセンブリを取得し、そこからAssembly.Locationプロパティを参照することで取得できます。
このほか、Assembly.CodeBaseプロパティを参照することもできます。 ただし、CodeBaseプロパティは.NET 5にてObsoleteとなっています。 またCodeBaseプロパティはfile://スキームのURIとしてパスを返すので、ファイルパスとして取得するにはいったんUriクラスに変換したのちにLocalPathプロパティを参照する必要があります。
using System;
using System.Reflection;
class Sample {
static void Main()
{
// 現在実行している実行可能ファイルのアセンブリを取得する
var assm = Assembly.GetEntryAssembly();
// アセンブリ(実行可能ファイル)のパスを表示
Console.WriteLine(assm.Location);
// アセンブリ(実行可能ファイル)のURIを表示
// (.NET 5以降では、Assembly.CodeBaseはObsoleteとなっている)
Console.WriteLine(assm.CodeBase); // warning SYSLIB0012: 'Assembly.CodeBase' は旧形式です ('Assembly.CodeBase and Assembly.EscapedCodeBase are only included for .NET Framework compatibility. Use Assembly.Location instead.')
// いったんUriに変換して、LocalPathのみを取得する
Uri codeBase = new Uri(assm.CodeBase);
// アセンブリ(実行可能ファイル)へのパスを表示
Console.WriteLine(codeBase.LocalPath);
}
}
Imports System
Imports System.Reflection
Class Sample
Shared Sub Main()
' 現在実行している実行可能ファイルのアセンブリを取得する
Dim assm As [Assembly] = [Assembly].GetEntryAssembly()
' アセンブリ(実行可能ファイル)のパスを表示
Console.WriteLine(assm.Location)
' アセンブリ(実行可能ファイル)のURIを表示
' (.NET 5以降では、Assembly.CodeBaseはObsoleteとなっている)
Console.WriteLine(assm.CodeBase) ' warning SYSLIB0012: 'Assembly.CodeBase' は旧形式です ('Assembly.CodeBase and Assembly.EscapedCodeBase are only included for .NET Framework compatibility. Use Assembly.Location instead.')
' いったんUriに変換して、LocalPathのみを取得する
Dim codeBase As New Uri(assm.CodeBase)
' アセンブリ(実行可能ファイル)へのパスを表示
Console.WriteLine(codeBase.LocalPath)
End Sub
End Class
E:\sample.dll file:///E:/sample.dll E:\sample.dll
E:\sample.exe file:///E:/sample.exe E:\sample.exe
/home/smdn/sample.exe file:///home/smdn/sample.exe /home/smdn/sample.exe
これとは別に、コマンドライン引数を参照する方法もあります。 Mainメソッドに渡されるコマンドライン引数には実行可能ファイルのパスは含まれませんが、先に解説したとおりEnvironment.GetCommandlineArgsメソッドで取得できるコマンドライン引数の先頭には実行可能ファイルの名前が格納されるので、ここから自プロセスのパスを取得することも出来ます。 ただし、NT系Windowsでは格納されるのはファイル名のみとなる点に注意が必要です。 Path.GetFullPathメソッドを使えばフルパスを取得できますが、カレントディレクトリが変更されている場合などは正しいパスを取得できるとは限りません。
using System;
using System.IO;
class Sample {
static void Main()
{
// コマンドライン引数の先頭の要素を取得
string file = Environment.GetCommandLineArgs()[0];
Console.WriteLine(file);
Console.WriteLine(Path.GetFullPath(file)); // フルパスに変換
}
}
Imports System
Imports System.IO
Class Sample
Shared Sub Main()
' コマンドライン引数の先頭の要素を取得
Dim file As String = Environment.GetCommandLineArgs()(0)
Console.WriteLine(file)
Console.WriteLine(Path.GetFullPath(file)) ' フルパスに変換
End Sub
End Class
sample.exe E:\sample.exe
/home/smdn/sample.exe /home/smdn/sample.exe
このほかApplication.ExecutablePathプロパティからも自プロセスのパスを取得できます。
自プロセスの情報
Process.GetCurrentProcessメソッドを使うと自プロセスを取得出来ます。 このメソッドが返すインスタンスから自プロセスに関する様々な情報を取得することが出来ます。 取得出来る情報や可能な操作についての詳細はProcessクラスのドキュメントを参照してください。
using System;
using System.Diagnostics;
class Sample {
static void Main()
{
// 自プロセスのProcessインスタンスを取得
Process p = Process.GetCurrentProcess();
Console.WriteLine("Id = {0}", p.Id); // プロセスのID
Console.WriteLine("Handle = {0}", p.Handle); // プロセスのネイティブハンドル
Console.WriteLine("StartTime = {0}", p.StartTime); // プロセスの起動時刻
Console.WriteLine("TotalProcessorTime = {0}", p.TotalProcessorTime); // プロセスの合計プロセッサ時間
Console.WriteLine("WorkingSet64 = {0}", p.WorkingSet64); // プロセスの物理メモリ使用量
}
}
Imports System
Imports System.Diagnostics
Class Sample
Shared Sub Main()
' 自プロセスのProcessインスタンスを取得
Dim p As Process = Process.GetCurrentProcess()
Console.WriteLine("Id = {0}", p.Id) ' プロセスのID
Console.WriteLine("Handle = {0}", p.Handle) ' プロセスのネイティブハンドル
Console.WriteLine("StartTime = {0}", p.StartTime) ' プロセスの起動時刻
Console.WriteLine("TotalProcessorTime = {0}", p.TotalProcessorTime) ' プロセスの合計プロセッサ時間
Console.WriteLine("WorkingSet64 = {0}", p.WorkingSet64) ' プロセスの物理メモリ使用量
End Sub
End Class
Id = 2280 Handle = 472 StartTime = 2012/01/06 5:06:40 TotalProcessorTime = 00:00:00.0468750 WorkingSet64 = 11964416
Id = 10163 Handle = 1026 StartTime = 2012/01/06 5:09:05 TotalProcessorTime = 00:00:00.0560020 WorkingSet64 = 6373376
自ファイルのバージョン
アセンブリのバージョン情報を設定・取得するで解説しています。
ロケール・カルチャ
スレッドのカルチャ
.NET Frameworkではスレッド毎にカルチャ(ロケール)が関連付けられます。 現在実行中のスレッドのカルチャを取得するには、Thread.CurrentThread.CurrentCultureプロパティを参照します。 CultureInfo.CurrentCultureプロパティでも同じ値を取得できます。
using System;
using System.Globalization;
using System.Threading;
class Sample {
static void Main()
{
// 現在のスレッドのカルチャを取得・表示する
Console.WriteLine(Thread.CurrentThread.CurrentCulture);
Console.WriteLine(CultureInfo.CurrentCulture);
}
}
Imports System
Imports System.Globalization
Imports System.Threading
Class Sample
Shared Sub Main()
' 現在のスレッドのカルチャを取得・表示する
Console.WriteLine(Thread.CurrentThread.CurrentCulture)
Console.WriteLine(CultureInfo.CurrentCulture)
End Sub
End Class
ja-JP ja-JP
カルチャ・ロケールについて、CultureInfoで取得できるカルチャ固有の情報などについてはロケール(カルチャ)で詳しく解説しています。
デフォルトエンコーディング
システムで使われるデフォルトの文字コード(エンコーディング)を取得するには、Encoding.Defaultプロパティを参照します。
using System;
using System.Text;
class Sample {
static void Main()
{
// デフォルトエンコーディングを取得・表示する
Console.WriteLine(Encoding.Default);
Console.WriteLine(Encoding.Default.WebName);
}
}
Imports System
Imports System.Text
Class Sample
Shared Sub Main()
' デフォルトエンコーディングを取得・表示する
Console.WriteLine(Encoding.Default)
Console.WriteLine(Encoding.Default.WebName)
End Sub
End Class
System.Text.DBCSCodePageEncoding shift_jis
System.Text.UTF8Encoding utf-8
System.Text.ASCIIEncoding us-ascii
System.Text.ASCIIEncoding us-ascii
カルチャのエンコーディング
Encoding.Defaultプロパティからはシステムで使われているエンコーディングを取得できますが、特定のカルチャで使用されるエンコーディングを取得するにはTextInfo.ANSICodePageプロパティを参照します。 システムのカルチャとは異なるカルチャでアプリケーションを動作させている場合に、その環境に応じたエンコーディングを取得したい場合などはこのプロパティを使うことが出来ます。
using System;
using System.Globalization;
using System.Text;
using System.Threading;
class Sample {
static void Main()
{
// システムのデフォルトエンコーディングを取得・表示する
Console.WriteLine(Encoding.Default);
Console.WriteLine(Encoding.Default.WebName);
Console.WriteLine();
// カルチャを'zh-TW'(中国語-台湾)に変更
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("zh-TW");
CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
// カルチャで使われるエンコーディングを取得・表示する
Encoding enc = Encoding.GetEncoding(currentCulture.TextInfo.ANSICodePage);
Console.WriteLine(currentCulture);
Console.WriteLine(enc);
Console.WriteLine(enc.WebName);
}
}
Imports System
Imports System.Globalization
Imports System.Text
Imports System.Threading
Class Sample
Shared Sub Main()
' システムのデフォルトエンコーディングを取得・表示する
Console.WriteLine(Encoding.Default)
Console.WriteLine(Encoding.Default.WebName)
Console.WriteLine()
' カルチャを'zh-TW'(中国語-台湾)に変更
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("zh-TW")
Dim currentCulture As CultureInfo = Thread.CurrentThread.CurrentCulture
' カルチャで使われるエンコーディングを取得・表示する
Dim enc As Encoding = Encoding.GetEncoding(currentCulture.TextInfo.ANSICodePage)
Console.WriteLine(currentCulture)
Console.WriteLine(enc)
Console.WriteLine(enc.WebName)
End Sub
End Class
System.Text.DBCSCodePageEncoding shift_jis zh-TW System.Text.DBCSCodePageEncoding big5
System.Text.UTF8Encoding utf-8 zh-TW I18N.CJK.CP950 big5
TextInfoクラスについてはカルチャと書式・テキスト処理・暦で詳しく解説しています。