Symfoware

Symfowareについての考察blog

mage.exeで配布するClickOnceアプリケーションにURLクエリの情報を渡す方法

csc.exeでコンパイルしたアプリケーションを、mage.exeを使用して配布してみました。

csc.exeでClickOnceアプリケーションをコンパイルし、mage.exeで配置する
http://symfoware.blog68.fc2.com/blog-entry-1135.html


.applicationファイルをクリックして起動した時のURLを取得したかったので調べてみます。


サンプルプログラム



ClickOnceアプリの起動時にパラメータを渡すには?[2.0のみ、C#、VB]
http://www.atmarkit.co.jp/fdotnet/dotnettips/514clickoncmdarg/clickoncmdarg.html

こちらを参考に作成しました。

単純に、ApplicationDeployment.CurrentDeployment.ActivationUri.AbsoluteUriで
取得できた文字列をラベルに表示するだけです。


■Form1.cs


  1. using System;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4. using System.Deployment.Application;
  5. namespace ClickOnceText {
  6.     public class Form1 : Form {
  7.         public static void Main() {
  8.             Form1 NewForm = new Form1();
  9.             Application.Run(NewForm);
  10.         }
  11.         public Form1() {
  12.             this.Size = new Size(500, 200);
  13.             
  14.             Label label = new Label();
  15.             label.AutoSize = true;
  16.             label.Location = new Point(10, 10);
  17.             
  18.             if (!ApplicationDeployment.IsNetworkDeployed) {
  19.                 label.Text = "ClickOnce起動ではありません。";
  20.             } else {
  21.                 try {
  22.                     label.Text = ApplicationDeployment.CurrentDeployment.ActivationUri.AbsoluteUri;
  23.                 } catch(Exception e) {
  24.                     MessageBox.Show(e.Message);
  25.                 }
  26.             }
  27.             
  28.             this.Controls.Add(label);
  29.         }
  30.     }
  31. }




普通にコンパイルして実行すると、こんな表示になります。

222_01.png



このソースを、以前行った手順でコンパイルし配布します。
csc.exeでClickOnceアプリケーションをコンパイルし、mage.exeで配置する


なお、ClickOnceのキャッシュは「C:¥Users¥Administrator¥AppData¥Local¥Apps¥2.0」とかに保存されます。
バージョン情報を変更せずに再配布する場合は、一旦このフォルダの中身を削除して実行します。

222_02.png



起動してみるとエラーになりました。
エラーの内容は、

オブジェクト参照がオブジェクト インスタンスに設定されていません。



222_03.png


ちょっとわかりにくいエラーですが、URLを取得するための「ActivationUri」とかが
nullですよってことを言ってます。

ClickOnceアプリケーションを配布するときの設定ファイル「.application」に、
アプリケーションに起動時のURLを伝えることを許可するかの設定があり、
デフォルトはfalseになっています。

具体的には、deploymentタグのtrustURLParametersアトリビュート。
これをtrueに変更してやれば、アプリケーションでURLを取得することが可能になります。


<deployment install="false" trustURLParameters="true" />




配布に使用しているバッチファイルをこのように変更しました。


@echo off

set mage="C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\mage.exe"

%mage% -New Application -ToFile publish\bin\Form1.exe.manifest -name "Form1" -Version 1.0.0.0 -FromDirectory publish\bin\
%mage% -Sign publish\bin\Form1.exe.manifest -CertFile symfo.pfx -Password symfoware

%mage% -New Deployment -AppManifest publish\bin\Form1.exe.manifest -ToFile publish\Form1.application
notepad publish\Form1.application

%mage% -Sign publish\Form1.application -CertFile symfo.pfx -Password symfoware

pause




証明書でハッシュを作成する前に、一旦作成したForm1.applicationをメモ帳で開くのがミソです。
実行すると、途中でメモ帳が開きます。

222_04.png


手動で、trustURLParameters="true"の内容を追記し保存。
メモ帳を閉じると証明書によるハッシュが付加されます。

222_05.png


このタイミングでタグを追加しないと、証明書によるハッシュの値と一致せず起動エラーになります。
※赤で囲った部分のハッシュは、上のxmlのハッシュから作成されるため、証明書をかます前に内容を確定する。

222_06.png



これで無事起動時のURLが取得出来ました。

222_07.png


クエリ文字列がついていても問題ないです。

222_08.png
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2013/09/18(水) 18:26:59|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ