none
ClickOnceのデータファイルを、発行後~クライアントセットアップの間に書き換えたい。 RRS feed

  • 質問

  • 質問させて下さい。

    スマートクライアントアプリケーションをClickOnce(Webサイト経由)でセットアップするパッケージを作りたいと思っています。

    このパッケージのサーバサイドのセットアッププログラムを作るに当たり、下記の問題が生じています。

    1.インストールフォルダーのURLがサーバー名固定で、対象サーバー毎に毎回発行し直さなければならない。

    2.データフォルダーにアプリ内で参照するWebサイトのアドレスを保持しているのですが、

    このアドレスも対象サーバーが変わると変更になるので、対象サーバー毎に発行し直しになる。

    この為、発行後(~IIS登録前)の書き換えで対応出来ないかと思っています。

    1については自己解決したのですが、2がうまくいきません。

    ※「Application Files\○○_0_0_0_0\○○.xml.deploy」を修正してみた所、修正前の内容でデータフォルダーに作成される。

    何か良い知恵、または根本的に間違っているといった指摘などあれば、よろしくお願い致します。

    2013年7月2日 0:30

回答

  • 2.データフォルダーにアプリ内で参照するWebサイトのアドレスを保持しているのですが、

    このアドレスも対象サーバーが変わると変更になるので、対象サーバー毎に発行し直しになる。


    ネットワークからセットアップするならClickOnce発行サーバーは見えているはずなので、発行サーバーに設定ファイルを別に置いて、セットアップ時の最初の起動でその設定ファイルを読みに行くのではだめですか?
    ネットワークアクセスさせて署名のない設定ファイルをダウンロードさせるのでセキュリティは低くなります。

    class Program
    {
        static void Main(string[] args)
        {
            if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
            {
                try
                {
                    var dep = System.Deployment.Application.ApplicationDeployment.CurrentDeployment;
                    if (dep.IsFirstRun)
                    {
                        Uri uri = new Uri(dep.UpdateLocation, "./setting.txt"); //ClickOnceの配置場所に対する相対位置に置かれたテキストファイル
                        System.Net.WebClient client = new System.Net.WebClient();
                        client.Encoding = System.Text.Encoding.UTF8;
                        string settingtext = client.DownloadString(uri);
                        Console.WriteLine(settingtext);
                    }
                }
                catch (Exception ex)
                {
                    Console.Error.WriteLine(ex.Message);
                }
            }
            Console.WriteLine("Hit Enter");
            Console.ReadLine();
        }
    }

    そもそも権限が制限されててネットアクセス禁止とかだとダメですね


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク aviator__ 2013年7月3日 1:55
    2013年7月2日 10:07
  • すいません・・・1.の問題も解決出来ていませんでした。

    ※キャッシュに正しいのがいたせいで、キャッシュをクリアしたらエラーになりました。

    初回起動時にダウンロードはとても良い案だったのですが、1.自体が対応出来なかったので個別発行する事にします。

    色々ありがとうございました。

    • 回答としてマーク aviator__ 2013年7月3日 1:55
    2013年7月3日 1:55

すべての返信

  • > 2.データフォルダーにアプリ内で参照するWebサイトのアドレスを保持しているのですが、
    > このアドレスも対象サーバーが変わると変更になるので、対象サーバー毎に発行し直しになる。

    VSの発行の機能自体では難しそうに思うので、発行自体をMSBuildをつかったバッチファイルを使うことにして
    REM 対象サーバ1
    xcopy <何処かにおいてある設定ファイル> <設定ファイルの置き場>
    msbuild <発行(ビルド)のコマンド>
    っていう感じで対象サーバの数だけ作ってあげれば良いのではないでしょうか。
    1.の問題をどう解決したのかわかりませんけど、そちらもmsbuildのオプションで一緒にできそうに思います。
    2013年7月2日 4:23
  • 回答ありがとうございます。

    1.の問題については、発行先直下と「Application Files\○○_0_0_0_0\」内の○○.application のファイル内の「deploymentProvider codebase」タグのアドレスと等しく修正する事で対応出来た様でした。

    説明が分かりにくくて申し訳ないのですが、今回の要件は対象サーバが複数あるというのとは少し異なります。

    現時点では対象サーバは未定な状態で発行しておいて、対象サーバに合わせてサーバセットアップ時に変更したいという内容です。

    ・・・これで伝わると良いのですが。。。

    2013年7月2日 5:05
  • > 現時点では対象サーバは未定な状態で発行しておいて、対象サーバに合わせてサーバセットアップ時に変更したいという内容です。

    では、こちらの内容に近いことなんでしょうかね。やったことないのでURLのみですいません。http://blogs.msdn.com/b/jpvsblog/archive/2011/05/26/clickonce-tips.aspx
    2013年7月2日 6:13
  • イメージ的にはそのサイトに近いのですが、そちらの内容は正直再発行と大差無かったのでスルーしてました。

    諦めるしかないのかもしれませんね。

    2013年7月2日 8:57
  • 2.データフォルダーにアプリ内で参照するWebサイトのアドレスを保持しているのですが、

    このアドレスも対象サーバーが変わると変更になるので、対象サーバー毎に発行し直しになる。


    ネットワークからセットアップするならClickOnce発行サーバーは見えているはずなので、発行サーバーに設定ファイルを別に置いて、セットアップ時の最初の起動でその設定ファイルを読みに行くのではだめですか?
    ネットワークアクセスさせて署名のない設定ファイルをダウンロードさせるのでセキュリティは低くなります。

    class Program
    {
        static void Main(string[] args)
        {
            if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
            {
                try
                {
                    var dep = System.Deployment.Application.ApplicationDeployment.CurrentDeployment;
                    if (dep.IsFirstRun)
                    {
                        Uri uri = new Uri(dep.UpdateLocation, "./setting.txt"); //ClickOnceの配置場所に対する相対位置に置かれたテキストファイル
                        System.Net.WebClient client = new System.Net.WebClient();
                        client.Encoding = System.Text.Encoding.UTF8;
                        string settingtext = client.DownloadString(uri);
                        Console.WriteLine(settingtext);
                    }
                }
                catch (Exception ex)
                {
                    Console.Error.WriteLine(ex.Message);
                }
            }
            Console.WriteLine("Hit Enter");
            Console.ReadLine();
        }
    }

    そもそも権限が制限されててネットアクセス禁止とかだとダメですね


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク aviator__ 2013年7月3日 1:55
    2013年7月2日 10:07
  • すいません・・・1.の問題も解決出来ていませんでした。

    ※キャッシュに正しいのがいたせいで、キャッシュをクリアしたらエラーになりました。

    初回起動時にダウンロードはとても良い案だったのですが、1.自体が対応出来なかったので個別発行する事にします。

    色々ありがとうございました。

    • 回答としてマーク aviator__ 2013年7月3日 1:55
    2013年7月3日 1:55