コンソールアプリで実行ファイルのパスの取得

C#でアプリケーションの存在するディレクトリのパスを取得するには以下のプロパティを利用する。

System.Windows.Forms.Application.StartupPath;

コンソールアプリではデフォルトではSystem.Windows.Formsが利用できない。
これを回避するには参照設定で"System.Windows.Forms"を参照設定に加えればいいらしいのだが、パスの参照をするだけでこれを加えるのはなんだか微妙。

と、いうことで"System.Windows.Forms"を利用せずに実行ファイルのディレクトリのパスを取得する方法。

FileInfo exePath = new FileInfo(Environment.CommandLine.Replace( "\"", "" ));
// "C:\foo\bar\baz.quux -i "C:\hoge\fuga\quux"の場合
// exePathには「C:\foo\bar\baz.quux -i C:\hoge\fuga\piyo」が入る

Console.WriteLine( exePath.Directory );
// この場合の出力は「C:\foo\bar」となる

参考

startuppathについて

2007/10/08(月)C#参考書候補

VCの次はC#ですか*1。とりあえず言語仕様とか概念とかほとんど知らないので、参考書を買うことにする。

具体的なプログラム作成を例にするタイプ*2よりは、言語仕様やその言語における概念に重点を置いて書かれている本*3の方が好きなので、そういったタイプの本を調査してみた。

こういった参考書は手に取ってみないと自分に合うかどうか判らないので、近いうちに大きな書店に行かないとな。と、ここまで書いて業務時間中に調べれば良かったとちょっと後悔。

*1 : その次はVBらしい(予定)。いったい何所に向かっているのだろうか>自分 そこにRomanはあるのだろうか

*2 : この手の本ってひたすらソースが誌面の大半を占めていて、全体としては中身がない本が多いんですよね。

*3 : 言語における考え方とか、基本的な関数の使い方を押さえておけば後はヘルプを見ながらなんとかすることが出来る。と、思う。全くのプログラミング未経験者でもないし。

C#エッセンシャルズ 第2版

#asin: is not allow
\2,730
とりあえずC#の基本を学ぶ上でのとっかかりにしやすそうな本。ただ、発行年が2002年なのでC#1.0(1.1?)ベースなのだろうなぁ。

Visual C#.NET逆引き大全 500の極意

#asin: is not allow
\2,730
VC.NET版は購入したけど、概念的な部分の説明くらいしか役に立たなかったなぁ。基本を押さえる上ではまあまあ良かったけど。

Visual C# 2005逆引きクイックリファレンス Windows XP/Vista対応

#asin: is not allow
\2,940
C# 2005に対応した本。

速効解決!逆引きハンドブックVisual C#

#asin: is not allow
\2,940
C#2.0 (.NET FW2.0)対応。

子フォームから親フォームのオブジェクトを参照する方法

C#でゲッターとかセッターとかを持ったクラスのことをBeanというのかは不明ですが、親フォームでBeanクラスに格納した値とか、メンバ変数とかを子フォームから参照する場合のメモです。
うろ覚えなのでソースの細かい部分は間違ってるかも(汗

追記 (07/10/08): アクセッサと言うらしい。

// SampleForm1.cs
public double sampleValiable;
public SampleBean sb;

private void sampleButton_Click(object sender, System.EventArgs e){
  this.sb = new SampleBean();
  
  this.sb.Valiable = 1;
  this.sampleValiable = 2.0;

  SampleForm2 sForm2 = new sForm2();
  sForm2.ShowDialog(this);
}

とした場合に子フォームであるSampleForm2からSampleForm1のメンバ変数sampleValiableなどにアクセスする場合は

// SampleForm2.cs

private void SampleForm2_Load(object sender, System.EventArgs e){
  SampleForm1 sForm1 = (SampleForm1)this.Owner;

  int getSbValiable = sForm1.sb.Valiable;
  double getForm1Member = sForm1.Valiable;
}

とすればいいらしい。もっとスマートに行う方法はあるのでしょうか?

追記: スマートに行う方法 2007/06/14

コンストラクタに渡してやればいいそうです。
上記のクラスをコンストラクタに渡してやる方法で書き換えると下記のようになります。

// SampleForm1.cs
private void sampleButton_Click(object sender, System.EventArgs e){
  SampleBean sb = new SampleBean();
  
  sb.Valiable = 1;
  double sampleValiable = 2.0;

  SampleForm2 sForm2 = new sForm2(sampleValiable, sb);
  sForm2.ShowDialog(this);
}
// SampleForm2.cs
public void SampleForm2(double sampleValiable, SampleBean sb){
}

これでコンストラクタにオブジェクトなどが渡せましたので、privateなメンバ変数でも定義してコンストラクタ内で引数を格納してやれば他のメソッドでも利用できるようになります。

あぁ、すっきりした。

追記 2007/10/08

この記事のみ以下の環境

  • Visual C# 1.0(1.1?) @ Visual Studio 2003
  • .NET Framework 1.1 SDK
  • Windows XP Professional SP2