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

§1.1 カレントディレクトリ

プロセスの現在のカレントディレクトリ(作業フォルダ)を取得するには、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);
  }
}
実行結果
E:\
E:\

E:\workdir

§1.2 環境変数

環境変数の取得・設定ついては環境変数で個別に解説しています。

§1.3 現在実行中のアセンブリ

Assembly.GetExecutingAssemblyメソッドを使うことで現在実行しているコードのあるアセンブリを取得することが出来ます。 ここからさらに、アセンブリの情報について調べることが出来ます。

using System;
using System.Reflection;

class Sample {
  static void Main()
  {
    // 現在実行しているアセンブリを取得する
    Assembly assm = Assembly.GetExecutingAssembly();

    Console.WriteLine(assm.FullName); // アセンブリの表示名
    Console.WriteLine(assm.CodeBase); // アセンブリの場所(パス)
  }
}
.NET Frameworkでの実行結果
sample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
file:///E:/sample.exe
Monoでの実行結果
sample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
file:///home/smdn/sample.exe

この他にも、Assembly.GetEntryAssemblyメソッドでエントリーポイント(Mainメソッド)を含むアセンブリ、Assembly.GetCallingAssemblyメソッドで現在実行中のメソッドを呼び出したアセンブリを取得することが出来ます。

§1.4 ターゲットのランタイムバージョン

アセンブリをビルドしたときのランタイムバージョンを取得するには、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);
  }
}
実行結果
v4.0.30319
4.0.30319.1


§1.5 参照アセンブリ

あるアセンブリが参照しているアセンブリを取得するには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);
  }
}
実行結果
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

§1.6 コマンドライン引数

現在のプロセスを起動したときのコマンドライン引数を取得するには、Mainメソッドでコマンドライン引数を受け取る文字列配列指定します。

using System;

class Sample {
  // Mainメソッドにコマンドライン引数を格納するための引数を用意する
  static void Main(string[] args)
  {
    // プロセス起動時に指定されたコマンドライン引数を表示する
    foreach (string arg in args) {
      Console.WriteLine(arg);
    }
  }
}
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);
    }
  }
}
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

§1.7 自プロセスのパス

自分自身のプロセス(現在実行している実行可能ファイル)のパスを取得するには、Assembly.GetEntryAssemblyメソッドで実行可能ファイルのアセンブリを取得し、そこからAssembly.CodeBaseプロパティを参照することで取得できます。 CodeBaseプロパティはURIの形式でパスを返すので、ファイルパスを取得するにはいったんUriクラスに変換したのちにLocalPathプロパティを参照するなどします。

using System;
using System.Reflection;

class Sample {
  static void Main()
  {
    // 現在実行している実行可能ファイルのアセンブリを取得する
    Assembly assm = Assembly.GetEntryAssembly();

    // アセンブリ(実行可能ファイル)のURIを表示
    Console.WriteLine(assm.CodeBase);

    // いったんUriに変換して、LocalPathのみを取得する
    Uri codeBase = new Uri(assm.CodeBase);

    // アセンブリ(実行可能ファイル)へのパスを表示
    Console.WriteLine(codeBase.LocalPath);
  }
}
.NET Frameworkでの実行結果
file:///E:/sample.exe
E:\sample.exe
Monoでの実行結果
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)); // フルパスに変換
  }
}
.NET Frameworkでの実行結果
sample.exe
E:\sample.exe
Monoでの実行結果
/home/smdn/sample.exe
/home/smdn/sample.exe

このほかApplication.ExecutablePathプロパティからも自プロセスのパスを取得できます。

§1.8 自プロセスの情報

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);              // プロセスの物理メモリ使用量
  }
}
.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

§1.9 自ファイルのバージョン

アセンブリのバージョン情報を取得するで解説しています。

§2 ロケール・カルチャ

§2.1 スレッドのカルチャ

.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);
  }
}
現在のカルチャが'ja-JP'の場合の実行結果例
ja-JP
ja-JP

カルチャ・ロケールについて、CultureInfoで取得できるカルチャ固有の情報などについてはロケール(カルチャ)で詳しく解説しています。

§2.2 デフォルトエンコーディング

システムで使われるデフォルトの文字コード(エンコーディング)を取得するには、Encoding.Defaultプロパティを参照します。

using System;
using System.Text;

class Sample {
  static void Main()
  {
    // デフォルトエンコーディングを取得・表示する
    Console.WriteLine(Encoding.Default);
    Console.WriteLine(Encoding.Default.WebName);
  }
}
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

§2.3 カルチャのエンコーディング

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);
  }
}
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クラスについてはカルチャと書式・テキスト処理・暦で詳しく解説しています。