|
.NET TIPS ClickOnceアプリの起動時にパラメータを渡すには?[2.0のみ、C#、VB]デジタルアドバンテージ 一色 政彦2006/10/20 |
![]() |
|
|
|
主にコンソール・アプリケーションなどでは、その起動時にコマンドライン経由でパラメータやオプションを指定することがあるが、ClickOnceアプリケーション(以降、ClickOnceアプリ)ではこれと同じような機能をWebページ上のハイパーリンク(=<a>タグのhref属性の内容)経由で実現できる。ClickOnceではこの機能を「URLパラメータ」と呼んでいる。
ただし、このURLパラメータの利用にはいろいろと制限があるので、注意が必要だ。
例えば、このURLパラメータは、Webページ上のハイパーリンクを利用しているため、ClickOnceアプリがオンライン・モード(=ネットワーク上から起動するモード)の場合には常にURLパラメータを渡せるのだが、オンライン/オフライン・モード(=ローカル環境へインストールするモード)の場合にはハイパーリンクから起動した場合でしか渡すことができないのだ。
つまり、オンライン/オフライン・モードを採用した場合、初回インストール時には必ずWebページ上からハイパーリンクをクリックしてインストールさせる必要があり、2回目以降の起動で[スタート]メニューにあるショートカットが利用されるのに備えて、初回起動時に取得したURLパラメータを保存しておくなど、何らかの工夫をする必要がある(なお、この保存先はどこでもよいが、例えば、分離ストレージやアプリケーション構成ファイル、ClickOnceデータ・ディレクトリ上に作成したファイルなどが考えられる)。
また、通常の配置マニフェスト(.applicationファイル)ではなくsetup.exe経由でClickOnceが起動された場合にも、このURLパラメータは利用できない。これはオンライン/オフライン・モードのみならず、オンライン・モードの場合にも発生する問題である。
setup.exeは、必須コンポーネントをインストールするためのもので、必須コンポーネントのインストール後、配置マニフェストをURLパラメータなしで呼び出してしまう。従って、必須コンポーネントがインストールされていない環境の場合、(最初にsetup.exeが実行されることになるので)問題となる。※なお、Visual Studio 2005(以降、VS 2005)はClickOnceアプリ・インストール用のHTMLファイル(publish.htm)を生成してくれるが、必須コンポーネントがインストールされていない環境でこのHTMLファイルが表示されると、(JavaScriptにより)ハイパーリンク先が自動的に(配置マニフェストから)setup.exeに切り替わることに注意してほしい。
それでは以下でURLパラメータの具体的な実装方法を紹介していこう。
URLパラメータの有効化
URLパラメータはデフォルトでは利用不可になっている。これを有効化するには、ClickOnce配置の発行オプションの設定で、[URL パラメータをアプリケーションに渡すことを許可する]チェック・ボックスにチェックを入れる必要がある。この設定方法については、「ClickOnceの真実 第3回 Visual Studio 2005でClickOnceを極めよう」を参考にしてほしい。
URLパラメータの設定
URLパラメータの設定は、直接ハイパーリンクの内容を書き換えて行う。要するに、次の例のように<a>タグのhref属性の内容を直接書き換えるわけである。
|
|
| URLパラメータの設定方法 | |
| 太字が書き足した部分、「%e3%81%93%e3%82%93%e3%81%ab%e3%81%a1%e3%81%af」は「こんにちは」をURLエンコードしたものである(詳細後述)。 なお、VS 2005で自動生成されるpublish.htmファイルでは、JavaScript部分のdirectLinkの部分(本稿の例では「directLink = "WindowsApplication1.application";」)にこのようなパラメータ(この例では「directLink = "WindowsApplication1.application?username=Isshiki& |
この例を見れば分かるように、URLパラメータの指定は、配置マニフェストへのURL(「〜.application」)の後に“?”を挟んで(基本的に)「パラメータ名=値」という構文で指定する。複数のパラメータを指定する場合には、「パラメータ名=値」という構文を“&”でつなげればよい。
また、パラメータで指定したい文字列に日本語が含まれる場合、厳密には下記以外の文字を使う場合では、URLエンコードを施した文字列を指定する必要がある。
「a〜z」「A〜Z」「0〜9」「.」「-」「_」「(」「)」「*」「'」
URLエンコードの方法については、「TIPS:文字列をURLエンコードするには?」を参照してほしい。
URLパラメータの取得
ClickOnceアプリ内部で(先ほど設定した)URLパラメータを取得するには、まずClickOnceアプリが起動されたときの呼び出し元ハイパーリンクのURL(以降、起動URL)を取得する。この起動URLは、ApplicationDeploymentオブジェクト(System.Deployment.Application名前空間)のActivationUriプロパティから取得できる*1。なお、現在実行中のClickOnceアプリのApplicationDeploymentオブジェクトはApplicationDeploymentクラスの静的プロパティCurrentDeploymentから取得できる。
|
*1 同様の内容は、現在のアプリケーション・ドメインの起動情報に格納されている起動データからも取得可能だ。具体的には「AppDomain.CurrentDomain.SetupInformation.ActivationArguments. |
次に、取得した起動URLからクエリ部分(=すべてのURLパラメータ)を抽出する。これには、Uriオブジェクト(System名前空間)のQueryプロパティが利用できる。このUriオブジェクトの生成は、そのコンストラクタのパラメータに起動URLを指定してインスタンス化すればよい。
最後にクエリ部分を各パラメータに分離してそれぞれの値を取得する。これには、Stringクラス(System名前空間)のSplitメソッドなどを駆使すればよい。Splitメソッドの利用方法については、「TIPS:Stringクラスにより文字列を文字列で分割するには?」を参考にしてほしい。
次のサンプル・プログラムでは、以上の流れに沿ってURLパラメータを取得している例だ。
|
||
| URLパラメータを取得するサンプル・プログラム(上:C#、下:VB) |
このサンプル・プログラムでは、Windowsフォームのコンストラクタでフォームの初期化(InitializeComponentメソッド)を行った後、GetUrlParametersメソッドを呼び出している。このGetUrlParametersメソッドは、URLパラメータを取得するために本稿で用意したメソッドだ。
GetUrlParametersメソッドの冒頭に記述されているApplicationDeploymentクラスの静的プロパティIsNetworkDeployedは、ClickOnceアプリかどうかを取得するためのものだ(falseの場合はClickOnceアプリではない)。ClickOnceアプリではない場合、メソッドの実行を中断している。
そして先ほどの説明どおり、まず起動URLを取得している。この起動URLの取得では、前述した「URLパラメータの有効化」([URL パラメータをアプリケーションに渡すことを許可する]チェック・ボックスの設定)を忘れていると、ApplicationDeployment.CurrentDeployment.ActivationUriがnull(Nothing)になってしまい、エラーとなるので注意すること。
次にクエリ部分を抽出し、最後に各パラメータに分離している。分離した後、最初のパラメータ名の中に、URLの構文で使用した“?”が含まれてしまうので、StringクラスのReplaceメソッドを使って“?”を削除している。さらに、HttpUtilityクラス(System.Web名前空間)の静的メソッドUrlDecodeを使って、URLエンコードされた文字列をデコードして元に戻している。
サンプル・プログラムの実行結果
以上のサンプル・プログラムを実行したのが、次の画面である。
![]() |
| サンプル・プログラムの実行結果 |
このようにURLパラメータを活用することで、ClickOnceアプリの実行時にパラメータを設定することができる。![]()
| 利用可能バージョン:.NET Framework 2.0のみ カテゴリ:Windowsフォーム 処理対象:ClickOnce 使用ライブラリ:ApplicationDeploymentクラス(System.Deployment.Application名前空間) 使用ライブラリ:Uriクラス(System名前空間) 使用ライブラリ:Stringクラス(System名前空間) 使用ライブラリ:HttpUtilityクラス(System.Web名前空間) 関連TIPS:文字列をURLエンコードするには? 関連TIPS:Stringクラスにより文字列を文字列で分割するには? |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
ホワイトペーパー(TechTargetジャパン)
- .NET TIPS - .NET開発のテクニックとヒント集 - (2010/3/11)
− LINQ文で動的にWhere句を組み立てるには?
− GridViewのフッタ行に合計値/平均値を表示するには?
− コレクションをプロパティ値によりグループ化するには? - いくつかのVS 2010 RCの更新 (2010/3/10)
Visual Studio 2010 RC版のIntelliSenseおよびWebデザイナに関するパッチのリリースと、そのほかの問題点についてのお知らせ - C#ラムダ式 基礎文法最速マスター (2010/3/9)
ラムダ式(C#)の基礎文法を、短い説明と簡単なコードで簡潔にまとめる。「ラムダ式、どう書くんだっけ?」という場合の簡易リファレンスとして活用できる - ASP.NET MVC:AJAXによる地図表示/単体テスト (2010/3/8)
ASP.NET MVCを使った、小さいながらも完全なWebアプリケーションの構築手順を最初から最後まで解説。最終部分となるステップ10〜12を公開
|
|
- PowerShell 2.0で始めるWindowsシステム管理
- natテーブルを利用したLinuxルータの作成・2
- ERPの“事業仕訳け”でIT予算をもっと有効に!
- 調査の難しい「OutOfMemoryError」事例、5選
- 組み込みシステム開発における“モデル”とは?
- 西和彦、ビル・ゲイツに会う
- 「事業仕分け」「修正予算」って何?国家予算の全体像
- IT業界職種カタログ(8)ITエデュケーション
- .NET TIPS - .NET開発のテクニックとヒント集 -
- Hyper-Vライブ・マイグレーションの運用ノウハウ
- 構造体の便利な用途、インターフェイス入門
- 3人中2人が間違える!? 片持ちばりの計算をしよう
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
| 仮想環境の構築とデータ保護の特効薬?! 実績と信頼性の高いパッケージで安心運用 New! |
| 仮想環境のバックアップもこれまでどおり 「まるごと取ってまるごと戻す」簡単運用 |
| おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |
| 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜Java編〜
| ◆ | おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| ◆ | 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| ◆ | Twitterのアカウントはなぜ突破された? メールによる新手の攻撃手法とその対策 |

| ◆ | もう仮想化のお試しフェイズは終わりだ! Hyper-V 2.0が基幹システムも仮想化 |
| ◆ | 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| ◆ | クライアント企業から求められる人材 ⇒IT技術と経営戦略を併せ持つ「戦略家」 |

| ◆ | .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| ◆ | 業務効率と情報セキュリティ対策を両立! 手間なく確実に機密情報を守る方法とは? |
| ◆ | 直属上司が海外にいるのエンジニアに見る 【実例】場所に捉われないワークスタイル |

| ◆ | 「仮想化工房」のマイスターが選んだのは VMware、Hyper-V、そしてVirtageだった! |
| ◆ | 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |

| ◆ | 【CTC事例】約30の基幹システムを統合! 膨大なバッジジョブを制御した方法は? |








