.NET TIPS

ClickOnceアプリのディレクトリ・パスを取得するには?[2.0のみ、C#、VB]

デジタルアドバンテージ 一色 政彦
2006/09/22
2006/09/22 更新

 ClickOnceで配置したアプリケーション(以降、ClickOnceアプリ)は、自動的にClickOnce独自のアプリケーション・ストア(以降、ClickOnceキャッシュ領域)に格納される。このClickOnceキャッシュ領域は、ユーザーごとに存在する「C:\Documents and Settings\<ユーザー名>\Apps\2.0」フォルダの配下にあり、その中でさらにアプリケーションごとのフォルダに分けられて存在する。そのため、どのディレクトリ・パスにClickOnceアプリが存在するのかというのは、開発者が前もって知ることはできない(つまり、実行時に調べる必要があるのだ)。

 実際にClickOnceアプリのディレクトリ・パスを調べるには、次の手順を実行すればよい。

  1. 実行中のメイン・アセンブリのフル・パスを取得する
  2. フル・パスからディレクトリ・パス部分を抽出する

 具体的には、次のようなコードになる。

using System;
using System.Reflection;
using System.IO;

class Program
{
  static void Main(string[] args)
  {
    // 1. 実行中のメイン・アセンブリのフル・パスを取得する
    Assembly asm = Assembly.GetEntryAssembly();
    string fullPath = asm.Location;

    // 2. フル・パスからディレクトリ・パス部分を抽出する
    string dirPath = Path.GetDirectoryName(fullPath);

    // 取得したパスの文字列をコンソールに出力
    Console.WriteLine(dirPath);
    // ユーザーに入力を要求することでプログラム実行を一時停止
    Console.ReadLine();
  }
}

// 筆者の環境での実行結果の例:
// C:\Documents and Settings\masa-i.D-ADVANTAGE\Local Settings\Apps\2.0\5XZZLGRV.3ZM\6829OQNH.66L\cons..tion_487762a2b687eac1_0001.0000_60fc12e94172e95e
Imports System.Reflection
Imports System.IO

Class Program

  Shared Sub Main()
    ' 1. 実行中のメイン・アセンブリのフル・パスを取得する
    Dim asm As Assembly = Assembly. GetEntryAssembly()
    Dim fullPath As String = asm.Location

    ' 2. フル・パスからディレクトリ・パス部分を抽出する
    Dim dirPath As String = Path.GetDirectoryName(fullPath)

    ' 取得したパスの文字列をコンソールに出力
    Console.WriteLine(dirPath)
    ' ユーザーに入力を要求することでプログラム実行を一時停止
    Console.ReadLine()
  End Sub

End Class

' 筆者の環境での実行結果の例:
' C:\Documents and Settings\masa-i.D-ADVANTAGE\Local Settings\Apps\2.0\5XZZLGRV.3ZM\6829OQNH.66L\cons..tion_487762a2b687eac1_0001.0000_60fc12e94172e95e
ClickOnceアプリのディレクトリ・パス部分を取得するサンプル・プログラム(上:C#、下:VB)

 まず1の手順を行うために、Assemblyクラス(System.Reflection名前空間)のGetEntryAssemblyメソッドを使ってメイン・アセンブリ(Assemblyオブジェクト)を取得し、そのLocationプロパティから実行されているClickOnceアプリのフル・パスを取得している。これについて詳しくは、「TIPS:実行ファイルのパスを取得するには?」を参考にしてほしい。

 次にPathクラス(System.IO名前空間)の静的メソッドGetDirectoryNameを使ってフル・パスからディレクトリ・パス部分を抽出している。これについての詳細は、「TIPS:パス文字列からディレクトリ・パス部分を取り出すには?」を参考にされたい。

 なおこの方法以外にも、Applicationクラス(System.Windows.Forms名前空間)の静的プロパティStartupPathからもClickOnceアプリのディレクトリ・パスは取得できる。

 あとは、取得したClickOnceアプリのディレクトリ・パスをコンソールに出力しているだけだ。

 ちなみに、従来のVisual Basic .NET(2002/2003)では、次のコード例のように、Assemblyクラスをコード内に記述する際、誤ってAssemblyキーワードと判別されないように角カッコ([ ])で囲む必要があった(詳しくは「TIPS:C#やVB.NETでキーワードを識別子として使用するには?」を参照してほしい)。

Dim asm As [Assembly] = [Assembly].GetEntryAssembly()

 しかしVisual Basic 2005では、上記のサンプル・プログラムで示されているように角カッコは不要である(恐らくVBコンパイラの仕様が改善されたのだろう)。

ClickOnceの真実 第3回 Visual Studio 2005でClickOnceを極めよう

 なお、ClickOnceで配布したアプリケーションの各ファイルは、ClickOnceアプリのディレクトリ・パスの配下に格納される。従って、通常のファイルは本稿のように取得したディレクトリ・パスの配下のファイルを取り扱えばよいわけだが、データ・ファイル(.XMLファイルや.MDBファイルなど)だけは別のデータ・ディレクトリに格納される。データ・ディレクトリのパスの取得方法は「TIPS:ClickOnceデータ・ディレクトリのパスを取得するには?」にて紹介する。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Windowsフォーム 処理対象:ClickOnce
使用ライブラリ:Assemblyクラス(System.Reflection名前空間)
使用ライブラリ:Pathクラス(System.IO名前空間)
関連TIPS:実行ファイルのパスを取得するには?
関連TIPS:パス文字列からディレクトリ・パス部分を取り出すには?
関連TIPS:C#やVB.NETでキーワードを識別子として使用するには?
関連TIPS:ClickOnceデータ・ディレクトリのパスを取得するには?

この記事と関連性の高い別の.NET TIPS
ClickOnceデータ・ディレクトリのパスを取得するには?
ClickOnceアプリケーションをデバッグするには?
ClickOnceのログ・ファイルを特定の場所に作成するには?
ClickOnceアプリの起動時にパラメータを渡すには?
ClickOnceオンライン・キャッシュ領域のサイズを変更するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

更新履歴
【2009/09/22】 「なおこの方法以外にも、Applicationクラス(System.Windows.Forms名前空間)の静的プロパティStartupPathからもClickOnceアプリのディレクトリ・パスは取得できる。」という記述を追加しました。

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間