.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」

TechTargetジャパン

Insider.NET フォーラム 新着記事
  • Kinectが切り開く“夢の近未来” (2012/2/2)
     日本を含めた世界中でKinect for Windowsセンサー商用版とSDK正式版がリリース。未来のコンピューティングはどう変化するのか?
  • 3つの視点でネイティブと.NETの適材適所を考察 (2012/1/31)
     アプリ開発は「ネイティブ」と「.NET」、どちらが最良? その問いには「適材適所」と答えるしかない。では、“適所”は一体どこかを考察する
  • SQL Azure Data Sync入門 (2012/1/30)
     SQL Azure/SQL Serverデータベース間のデータ同期を簡単に実現するサービスとは? その仕組みや使用手順を解説
  • Windows Phoneアプリ市場の現状を分析する (2012/1/27)
     Windows Phone のアプリ・ストアに日々登録されている多種多様なアプリ。カテゴリ別のアプリ数は? 市場の現状を明らかにする

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH