アプリケーションのアップグレード時に設定が失われないように、.NETユーザー設定の場所を制御できますか?
質問
user.config
ファイルの場所をカスタマイズしようとしています。現在、ハッシュとバージョン番号とともに保存されています
%AppData%\[CompanyName]\[ExeName]_Url_[some_hash]\[Version]\
アプリケーションのバージョンにとらわれないようにしたい
%AppData%\[CompanyName]\[ProductName]\
これを行うことができますか?影響は何ですか?アップグレード後にユーザーは以前のバージョンの設定を失いますか?
解決
最初の質問に答えるには、技術的にファイルを好きな場所に置くことができますが、デフォルトの場所は2つの例の最初なので、自分でコーディングする必要があります。 (自分で行う方法へのリンク)
2番目の質問に関しては、アプリケーションのデプロイ方法によって異なります。 .msiを介して展開する場合、セットアッププロジェクト(msiのビルド元)のプロパティには、「アップグレードコード」と「製品コード」の2つのハッシュがあります。これらは、msiのインストール方法、および同じアプリケーションの他のバージョンの横でアップグレード、上書き、またはインストールするかどうかを決定します。
たとえば、2つのバージョンのソフトウェアがあり、それらが異なる「アップグレード」コードを持っている場合、Windowsでは、名前が何であるかに関係なく、それらは完全に異なるソフトウェアです。ただし、「アップグレード」コードは同じであるが「製品」コードが異なる場合、2番目のmsiをインストールしようとすると、アップグレードするかどうかを尋ねられます。その時点で、古い構成から新しい構成へ。両方の値が同じで、バージョン番号が変更されていない場合、新しい構成は古い構成と同じ場所にあり、何もする必要はありません。 MSDNドキュメント
ClickOnceは、ClickOnceバージョン#とURLパスに基づいているため、少し異なりますが、同じ場所に「公開」し続ける限り、アプリケーションの新しいバージョンが継続することがわかりました。既存の構成を使用します。 ( ClickOnceが更新を処理する方法へのリンク )
カスタムインストールスクリプトを使用してmsiのインストール中に構成を手動でマージする方法もありますが、それを行うための正確な手順は覚えていません...(この web.configで行う方法のリンク)
他のヒント
今後この問題が発生した場合の参考として、この引用テキストを追加したかった。おそらく、アップグレード:
Properties.Settings.Value.Upgrade();
クライアント設定に関するよくある質問のブログ投稿:(アーカイブ)
Q:user.configパスにバージョン番号があるのはなぜですか?アプリケーションの新しいバージョンをデプロイした場合、ユーザーは以前のバージョンで保存されたすべての設定を失いませんか?
A:いくつかの理由があります user.configパスはバージョンに依存します。
(1)並列展開をサポートするには の異なるバージョンの アプリケーション(これを行うことができます たとえば、Clickonce)。それは の異なるバージョンで可能 異なる設定を持つアプリケーション 保存しました。
(2)アップグレードするとき アプリケーション、設定クラスは 変更されていない可能性があります 保存されたものと互換性がある、 問題につながる可能性があります。
ただし、簡単に 以前の設定をアップグレードする アプリケーションのバージョン 最新。単に電話する ApplicationSettingsBase.Upgrade()および から設定を取得します に一致する以前のバージョン クラスとストアの現在のバージョン それらを現在のバージョンの user.configファイル。あなたも持っています この動作をオーバーライドするオプション 設定クラスまたは プロバイダーの実装。
Q:わかりましたが、どうすればいいかわかりますか アップグレードを呼び出しますか
A:いい質問です。 Clickonceでは、 新しいバージョンをインストールします アプリケーション、ApplicationSettingsBase それを自動的に検出します その時点で設定をアップグレードする 設定が読み込まれます。 Clickonce以外で 場合、自動アップグレードはありません- 自分でアップグレードを呼び出す必要があります。 これは、いつ決定するための1つのアイデアです アップグレードを呼び出すには:
ブール設定を呼び出します CallUpgradeにデフォルトを設定します 真の値。アプリが起動するとき 次のようなことができます:
if (Properties.Settings.Value.CallUpgrade)
{
Properties.Settings.Value.Upgrade();
Properties.Settings.Value.CallUpgrade = false;
}
これにより、Upgrade()が確実に 初めて呼ばれた アプリケーションは新しいバージョンの後に実行されます デプロイされます。
実際に動作する可能性があるとは思わない-Microsoftがこの機能を提供する方法はありませんが、方法は同じです。
user.configファイルは
c:\Documents and Settings>\<username>\[Local Settings\]Application Data\<companyname>\<appdomainname>_<eid>_<hash>\<verison>
<c:\Documents and Settings>
は、非ローミング(上記のローカル設定)またはローミングのユーザーデータディレクトリです。
<username>
はユーザー名です。
<companyname>
は、CompanyNameAttribute値です(使用可能な場合)。それ以外の場合、この要素は無視してください。
<appdomainname>
はAppDomain.CurrentDomain.FriendlyNameです。通常、これは.exe名にデフォルト設定されます。
<eid>
は、ハッシュに利用可能な証拠に基づくURL、StrongName、またはPathです。
<hash>
は、CurrentDomainから収集されたエビデンスのSHA1ハッシュで、次の優先順位です。
1. StrongName
2. URL:
どちらも使用できない場合は、.exeパスを使用します。
<version>
はAssemblyInfoのAssemblyVersionAttribute設定です。
詳細な説明はこちら http://msdn.microsoft.com/en-us/library /ms379611.aspx
(@ Amrの答えにコメントとして追加しますが、まだそれを行うのに十分な担当者がいません。)
MSDN記事の情報は非常に明確で、まだ適用されます。ただし、SHA1ハッシュは、より一般的なベース16ではなく、ベース32でエンコードされて書き出されることに言及していません。
使用されているアルゴリズムはToBase32StringSuitableForDirName
に実装されていると思います。 Microsoft Reference Sourceにあります。