Symfoware

Symfowareについての考察blog

csc.exeでClickOnceアプリケーションをコンパイルし、mage.exeで配置する

JavaのJava Web Startと同様に、C#ではClickOnceというアプリケーション配布の方法が用意されています。
Google Chromeのインストールに使用されているのが一番有名でしょうか。

ClickOnceの仕組みがよくわからなかったので、Visual Studioに頼らず、
csc.exeでコンパイルしたアプリケーションを手動で配置し、学んでみたいと思います。



配布するアプリケーション



配布するアプリケーションは、このような簡単なプログラムにしました。

■Form1.cs

  1. using System;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4. namespace ClickOnceText {
  5.     public class Form1 : Form {
  6.         public static void Main() {
  7.             Form1 NewForm = new Form1();
  8.             Application.Run(NewForm);
  9.         }
  10.         public Form1() {
  11.             this.Size = new Size(500, 200);
  12.             Button messageButton = new Button();
  13.             messageButton.Size = new Size(130, messageButton.Size.Height);
  14.             messageButton.Text = "ClickOnceテスト";
  15.             messageButton.Location = new Point(50, 50);
  16.             this.Controls.Add(messageButton);
  17.             messageButton.Click += new EventHandler(MessageButton_Click);
  18.         }
  19.         private void MessageButton_Click(object sender, EventArgs e) {
  20.             MessageBox.Show("Hello world");
  21.         }
  22.     }
  23. }





ビルドするためのバッチファイルは以下のようになります。

@echo off
set csc="C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe"

%csc% /nologo /target:winexe Form1.cs





バッチを実行すると、Form1.exeが出力されると思います。
実行してみると、こんな画面が表示されます。

221_01.png


このForm1.exeをClickOnceで公開してみます。







公開サーバーの準備



本来ならば、Windows Server + IISで公開するのが良いのですが、
今回はDebian + Apacheで公開してみようと思います。
そのほうが、Webサーバーに必要な最低限の設定もわかると思いましたので。

Publishing a .NET ClickOnce Application to a linux Apache Server
http://www.devprise.com/2006/12/10/publishing-a-net-clickonce-application-to-a-linux-apache-server/

こちらを参考に、mime.confを編集しました。


# vi /etc/apache2/mods-enabled/mime.conf




30行目付近の、「AddType application/x-bzip2 .bz2」の後に以下の3行を追加。


AddType application/x-ms-application .application
AddType application/x-ms-manifest .manifest
AddType application/octet-stream .deploy




設定ファイルの再読み込み


# /etc/init.d/apache2 reload




これでapacheの設定は完了です。








mage.exeの入手



ClickOnceアプリケーションの配布には、mage.exeというプログラムを使用するようです。
これは、Visual Studioをインストールするか、SDKをインストールすれば入手できます。

Microsoft Windows SDK for Windows 7 and .NET Framework 4
http://www.microsoft.com/en-us/download/details.aspx?id=8279

221_02.png

こちらのDownloadをクリックすると、「winsdk_web.exe」がダウンロードできます。
winsdk_web.exeを実行すると、SDKのインストールが始まります。

221_03.png

221_04.png

221_05.png

Installation Optionsでは、「.NET Development」を選択しておきます。
これで欲しいmage.exeがインストールされます。

221_06.png

221_07.png

インストール完了です。

221_08.png


インストールが終了したら、「C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin」に
「mage.exe」がインストールされているはずです。









証明書ファイルの作成



ClickOnceで発行するアプリケーションに署名するため、証明書ファイルを作成します。
といっても、テスト用なのでツールを使って作成します。

証明書の作成は、こちらのURLを参考にしました。

ClickOnceのマニフェストに署名するためのテスト用の証明書を作成する
http://quickprogram.blogspot.jp/2010/03/vc-clickonce.html


先ほどインストールしたWindows SDKで、証明書の作成に必要な「makecert.exe」と「pvk2pfx.exe」も
インストールされているはずです。


こんなバッチファイルを作成して実行しました。

■make_pfx.bat

@echo off

set makecert="C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\makecert.exe"
%makecert% -r -pe -n "CN=SYM" -sv symfo.pvk symfo.cer

set pvk2pfx="C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\pvk2pfx.exe"
%pvk2pfx% -pvk symfo.pvk -spc symfo.cer -pfx symfo.pfx -po "symfoware"




makecert.exeを実行しているときに、こんなダイアログが表示されます。

221_09.png

今回はテストなので「なし」を選択しました。


バッチファイルを実行すると「symfo.pfx」が出力されていると思います。
ClickOnceアプリケーション発行時、このファイルを使用します。









ClickOnceアプリケーションの配布



インストールしたmage.exeを使用して、コンパイルしたForm1.exeの発行を行なってみます。
発行は、以下のURLを参考にしました。


チュートリアル : ClickOnce アプリケーションを手動で配置する
http://msdn.microsoft.com/ja-jp/library/vstudio/xc3tc5xx.aspx

ClickOnceの配布手順がよくわからなかったのでメモ
http://d.hatena.ne.jp/masakitk/20110111/1294751018



まず、「publish」というフォルダを作成し、その中にさらに「bin」というフォルダを作成します。
このbinフォルダの中にClickOnceで実行したい「Form1.exe」をコピーします。

221_10.png

※この「bin」フォルダにあるexeやdllのハッシュを取得し、配布用のファイルが作成されます。


「publish」フォルダと同じ階層まで戻り、発行用のバッチファイルを作成します。

■publish.bat


@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
%mage% -Sign publish\Form1.application -CertFile symfo.pfx -Password symfoware




最終的に、このようなフォルダの状態になりました。
必要なのは、「publush」フォルダと「publish」バッチファイル、そして証明書ファイルの「symfo.pfx」です。

221_11.png


バッチファイルを実行すると、binフォルダには「Form1.exe.manifest」が、
publishフォルダには、「Form1.application」が作成されています。

221_12.png

221_13.png


publishフォルダの中身をまるごと、webサーバーの/var/www/clickonceにコピーします。
ブラウザで「http://[webサーバー]/clickonce/」にアクセスすると、こんな表示になるかと思います。
Form1.applicationのリンクをクリックします。

221_14.png


アプリケーションの起動確認が行われるので「実行」をクリック。

221_15.png


これは必ず失敗するはずです。

221_16.png


詳細を表示してみると、よくわからんエラー内容が表示されます。


アプリケーションの概要
    * オンラインのみのアプリケーションです。

エラーの概要
    以下はエラーの概要です。これらのエラーの詳細はログに一覧表示されています。
    * http://192.168.1.3/clickonce/Form1.application のライセンス認証により例外が発生しました。 次の失敗メッセージが検出されました:
        + マニフェスト内の参照が、ダウンロードされたアセンブリ Form1.exe の ID と一致しません。




この内容が全くわからず困っていたのですが、ここが参考になりました。

Error deploying ClickOnce application - Reference in the manifest does not match the identity of the downloaded assembly
http://stackoverflow.com/questions/5337458/error-deploying-clickonce-application-reference-in-the-manifest-does-not-match


リンクをたどってみると、NoWin32Manifestをtrueにしろとのこと。

ClickOnce, Mage and Visual Studio 2008 (includes fix)
http://geekswithblogs.net/rakker/archive/2007/12/06/117449.aspx


csc.exeのオプションにもありました。

/nowin32manifest (Win32 マニフェストの禁止) (C# コンパイラ オプション)
http://msdn.microsoft.com/ja-jp/library/bb513864(v=vs.90).aspx


ということで、そうとうハマったのですがClickOnceで配布するexeは、「/nowin32manifest」オプションを
つけてコンパイルしないとダメだそうです。

最初のForm1.exeをビルドするバッチを変更します。


@echo off
set csc="C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe"

%csc% /nologo /target:winexe /nowin32manifest Form1.cs





publish/binのForm1.exeを/nowin32manifestオプションをつけてコンパイルしたものに差し替え、
再度publish.batを実行し、manifestとapplicationファイルを作り直します。

webサーバーの/var/www/clickonceの内容も、最作成したファイルで置き換えていざ実行。


221_17.png

221_18.png


ちゃんと実行出来ました。






【参考URL】

Publishing a .NET ClickOnce Application to a linux Apache Server
http://www.devprise.com/2006/12/10/publishing-a-net-clickonce-application-to-a-linux-apache-server/

ClickOnceのマニフェストに署名するためのテスト用の証明書を作成する
http://quickprogram.blogspot.jp/2010/03/vc-clickonce.html

チュートリアル : ClickOnce アプリケーションを手動で配置する
http://msdn.microsoft.com/ja-jp/library/vstudio/xc3tc5xx.aspx

ClickOnceの配布手順がよくわからなかったのでメモ
http://d.hatena.ne.jp/masakitk/20110111/1294751018

Error deploying ClickOnce application - Reference in the manifest does not match the identity of the downloaded assembly
http://stackoverflow.com/questions/5337458/error-deploying-clickonce-application-reference-in-the-manifest-does-not-match
関連記事

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

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