自プロセス・アセンブリの情報

カレントディレクトリ

プロセスの現在のカレントディレクトリ(作業フォルダ)を取得するには、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
.NET Frameworkでの実行結果
sample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
E:/sample.exe
Monoでの実行結果
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
Windows 7 + .NET Framework 4での実行結果
E:\>csc sample.cs
E:\>sample.exe /foo /bar=baz "hoge moge"
/foo
/bar=baz
hoge moge
Ubuntu 11.10 + Mono 2.10.8での実行結果
$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
Windows 7 + .NET Framework 4での実行結果
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
Ubuntu 11.10 + Mono 2.10.8での実行結果
$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
.NET 5での実行結果
E:\sample.dll
file:///E:/sample.dll
E:\sample.dll
.NET Frameworkでの実行結果
E:\sample.exe
file:///E:/sample.exe
E:\sample.exe
Monoでの実行結果
/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
.NET Frameworkでの実行結果
sample.exe
E:\sample.exe
Monoでの実行結果
/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
.NET Frameworkでの実行結果例
Id = 2280
Handle = 472
StartTime = 2012/01/06 5:06:40
TotalProcessorTime = 00:00:00.0468750
WorkingSet64 = 11964416
Monoでの実行結果例
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
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
Windows 7 + .NET Framework 4の実行結果
System.Text.DBCSCodePageEncoding
shift_jis
Ubuntu 11.10 + Mono 2.10.8、環境変数LANGが'ja_JP.UTF-8'の場合の実行結果
System.Text.UTF8Encoding
utf-8
Ubuntu 11.10 + Mono 2.10.8、環境変数LANGが'ja_JP.SHIFT_JIS'の場合の実行結果
System.Text.ASCIIEncoding
us-ascii
Ubuntu 11.10 + Mono 2.10.8、環境変数LANGが'C'の場合の実行結果
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
Windows 7 + .NET Framework 4での実行結果
System.Text.DBCSCodePageEncoding
shift_jis

zh-TW
System.Text.DBCSCodePageEncoding
big5
Ubuntu 11.10 + Mono 2.10.8での実行結果
System.Text.UTF8Encoding
utf-8

zh-TW
I18N.CJK.CP950
big5

TextInfoクラスについてはカルチャと書式・テキスト処理・暦で詳しく解説しています。