#概要
初めて記事を投稿します。よろしくお願いします。
仕事でClickOnceを使ってWindowsアプリケーションを配布していますが、主に起動時に問題が起きていました。最近やっと解消のめどが立ってきたので、自分のやってきたことを纏めることとClickOnceに関していまいち情報がネット上になかったりするので、誰かの役に立てばいいなと思ったりもします。
##開発環境
VisualStudio 2017 Professional
##言語
C#
##ClickOnceとは
WindowsFormやWPFを配置するためのMicrosoftの技術(Wikiより)
###利点
1、インストールは管理者権限を必要としないため、配布用サイトを構築しておけばユーザがインストール、更新を行えるので配布が楽。
###欠点
1、更新作業に失敗するとアプリケーションをアンインストールしないと再インストールできない。
2、アプリケーションの実体が「Program Files」直下になく、「c:\Users\<ユーザー名>\AppData\Local\Apps\2.0\」等にインストールされるため、設定ファイルなどに間違いがあると修正が難しい。
##問題点とは
1、起動が遅い、ものすごく遅い。アプリの起動に1~2分かかる。
2、Windows10では早い場合がある。Windows8,Windows7はほぼ遅い。
3、現象が起きている環境はほぼインターネットの接続がない環境だが、同じ環境を作っても再現しない。
4、通常のexeをダブルクリックする起動では、遅い環境でも早く起動する。
##何が原因か?
起動が遅いので起動時に行われるClickOnceの更新のチェックが原因と考えました。
ClickOnceの設定はプロジェクトのプロパティの発行から行えますが、下の画像のように更新の確認を「アプリケーションの開始前に行う」にしているため、更新チェックが起動の遅い原因になっていると予想し、
次のように設定を変更し、遅い環境で実行
結果、まったく変わりません。びっくりするほど変わりません。むしろ遅くなったまである。
「アプリケーションの更新プログラムを確認する頻度を指定してください」項目が「アプリケーションが実行されるたびに確認する」になっているために改善しないと予想し、以下のように変更し実行
それでもやはり起動速度は変わらない。チェックに行くのは1日に一回にしているのに起動が遅い。多分チェック処理はどうやっても動き起動が遅くなる原因ではないかと結論付けた。
##解決方法
結局、VisualStudioの更新方法の設定ではどうやっても早くならないので更新チェックをしないように設定し、プログラム側で対応するようにすると劇的に早くなりました(EXEを直接起動したときの同じぐらい)。コードは以下の通りです。
//バージョンチェック&更新処理
ApplicationDeployment deploy;
deploy = ApplicationDeployment.CurrentDeployment;
bool bolCheckUpdate = false;
//アップデートがあるかチェック
bolCheckUpdate = deploy.CheckForUpdate();
if (bolCheckUpdate)
{
//アップデートがあるので、アップデート処理
bool bolUpdate = deploy.Update();
if (bolUpdate == true)
{
//更新処理が終わったのでアプリケーションをリスタートする
Application.Restart();
}
else
{
//更新がエラーしたので任意の処理
}
}
上記のコードをアプリケーションの起動時(Program.cs等)に記述すると起動時にバージョンチェックが行われ、更新プログラムがある場合更新処理が行われます。ただし、deploy.Update()はダイアログなど表示されず、何もしていないようでいきなりアップデートするので、更新中メッセージを表示したりするのがいいと思います。
遅い環境に関しては、クライアントから複数のセグメントを介してサーバに接続するような環境(自分では手が出せない)なので等いろいろ原因を考えましたが、ネットワーク関連は変更等することができないのでこういった対応をしました。あまり需要のない仕組みだとは思いますが、同じようなことで悩んでいれば試す価値はあるかもしれません。
技術的な説明、コードの変な個所などあればツッコミお待ちしてます。