屋根裏部屋別館blog

アクセスカウンタ

zoom RSS .NET Frameworkで現在実行中のモジュールの格納パスを取得する方法

<<   作成日時 : 2005/06/03 13:55   >>

なるほど(納得、参考になった、ヘー) ブログ気持玉 2 / トラックバック 0 / コメント 2

 .NET Frameworkで作成されたa.exeファイルと同じディレクトリに何らかのファイル、もしくは別のexeファイル(b.exeとしましょう)があったとします。このa.exeから子プロセスとして、b.exeを起動させたい場合、a.exeのディレクトリにパスが通っていなく、起動ディレクトリをa.exeがあるフォルダ以外に設定していた場合、起動できない可能性があります。

 このような現象を回避するためには、a.exeが格納されているフルパスを取得しなくてはなりませんが、ちょっとはまったので記録として残しておきます(Environment.CurrentDirectoryではだめなんですよ。やってみればわかります)。なお、この問題に対処するにあたって、川俣晶さんの.NET Frameworkで現在実行中のアセンブリのフルパス名を得る方法に助けられました(オータムマガジンの技術雑記に書かれていることは覚えていたのですが、私の検索キーワードがまずくて、ぐぐってもヒットしませんでした(^^;)。方法としては以下の二通りが考えられます。

  1. AssemblyクラスのGetExecutingAssembly経由でとる

  2. Windows APIを使用してGetCommandLine()→CommandLineToArgvW()というコンボでとる



 1の場合、C#で書くとこんな感じです。
<pre>
using System.Reflection;

Assembly  mainAssembly  =  Assembly.GetExecutingAssembly();
Module  mainMod = mainAssembly.GetModules()[0];
string  strInstalledDir = Path.GetDirectoryName(mainMod.FullyQualifiedName);
</pre>

 managedコードが使えるので、わざわざ危ないunsafeを使わなくてはならない2を使う必要はあまりないでしょう。そして、こんな苦労をするのは、どのプロセスからロードされるかわからないDLLの中から取得したい場合か、コンソールアプリケーションだけだろうと思います。Formを持つアプリケーションの場合、System.Windows.Forms.Application.StartupPathというプロパティが使えるんですよ。なんでWindows.Formsだけ…。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 2
なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー)

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(2件)

内 容 ニックネーム/日時
Application.StartupPathを使うとWindowsのログインユーザーが違うと違う所に行ってしまうようです。
System.IO.Path.GetDirectoryName(System.Environment.GetCommandLineArgs(0))
で対処しようと思っているんですが大丈夫なのかなぁ。
vb.net2005
2008/12/17 17:23
ログインユーザーが違うと…というのは確かにはまりどころですね。私も最近該当しました。Environment系は注意どころです。
管理人
2008/12/19 00:21

コメントする help

ニックネーム
本 文

.NET Frameworkで現在実行中のモジュールの格納パスを取得する方法 屋根裏部屋別館blog/BIGLOBEウェブリブログ
文字サイズ:       閉じる