Czy Mogę kontrolować lokalizację of.NET ustawienia użytkownika aby uniknąć utraty ustawień przy aktualizacji aplikacji?

Próbuję dostosować lokalizację pliku user.config. Obecnie jest przechowywany z Hashem i numerem wersji

%AppData%\[CompanyName]\[ExeName]_Url_[some_hash]\[Version]\

Chcę, aby była zgodna z wersją aplikacji

%AppData%\[CompanyName]\[ProductName]\

Czy można to zrobić i jak? Jakie są konsekwencje? czy użytkownik straci swoje ustawienia z poprzedniej wersji po aktualizacji?

Author: Anthony Mastrean, 2009-03-07

4 answers

Aby odpowiedzieć na pierwsze pytanie, technicznie możesz umieścić plik w dowolnym miejscu, jednak będziesz musiał sam go zakodować, ponieważ domyślne miejsce, do którego trafia plik, to pierwszy z twoich dwóch przykładów. (link do jak to zrobić samemu)

Jeśli chodzi o drugie pytanie, to zależy od tego, jak wdrożysz aplikację. Jeśli wdrożyć poprzez a .msi, następnie we właściwościach projektu instalacyjnego (z którego zbudowany jest msi) znajdują się dwa skróty, "kod aktualizacji" i "Kod produktu". Określają one, w jaki sposób msi może być zainstalowany oraz czy aktualizuje się, nadpisuje lub instaluje obok dowolnej innej wersji tej samej aplikacji.

Na przykład, jeśli masz dwie wersje oprogramowania i mają różne kody 'upgrade', to w systemie windows są to zupełnie inne elementy oprogramowania, niezależnie od nazwy. Jeśli jednak kod "Uaktualnij" jest taki sam, ale Kod "produktu" jest inny, to podczas próby zainstalowania drugiego msi zapyta cię, czy chcesz upgrade, w którym to czasie ma skopiować wartości ze starego config do nowego config. Jeśli obie wartości są takie same, a Numer wersji się nie zmienił, to nowy config będzie w tym samym miejscu co Stary config i nie będzie musiał nic robić. dokumentacja MSDN

ClickOnce jest trochę inny, ponieważ opiera się bardziej na wersji ClickOnce # i ścieżce URL, jednak odkryłem, że tak długo, jak nadal "publikować" w tym samym miejscu nowa wersja aplikacji będzie nadal korzystać z istniejącej konfiguracji. (link do tego jak ClickOnce obsługuje aktualizacje )

Wiem też, że istnieje sposób na ręczne scalanie configów podczas instalacji msi przy użyciu niestandardowych skryptów instalacyjnych, ale nie pamiętam dokładnych kroków, aby to zrobić... (zobacz ten link, aby dowiedzieć się, jak to zrobić z siecią.config)

 39
Author: uzbones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-27 02:51:19

Chciałem dodać ten cytowany tekst jako odniesienie, gdy mam ten problem w przyszłości. Podobno możesz poinstruować infrastrukturę ApplicationSettings, aby skopiowała ustawienia z poprzedniej wersji, wywołując Upgrade :

Properties.Settings.Value.Upgrade();

From Client Settings FAQ Blog post: (archiwum)

P: Dlaczego w użytkowniku jest numer wersji.ścieżka konfiguracji? Jeśli wdrożę nową wersję aplikacji, użytkownik nie straci wszystkich ustawień zapisana przez poprzednią wersję?

O: jest kilka powodów, dla których użytkownik.ścieżka konfiguracji jest wrażliwa na wersję.

(1) do obsługi wdrażania side-by-side różnych wersji aplikacji (można to zrobić za pomocą Clickonce, na przykład). On możliwe dla różnych wersji aplikacja ma różne ustawienia uratowany.

(2) po uaktualnieniu an aplikacji, Klasa ustawień może zostały zmienione i nie mogą być kompatybilny z tym, co zostało zapisane, co może prowadzić do problemów.

Jednak ułatwiliśmy Uaktualnij ustawienia z poprzedniego wersja aplikacji do najnowsze. Po prostu zadzwoń ApplicationSettingsBase.Upgrade () oraz pobierze ustawienia z poprzednia wersja pasująca do aktualna wersja klasy i sklepu je w obecnej wersji użytkownik.plik konfiguracyjny. Masz również opcja nadpisania tego zachowania albo w Twoim Klasa ustawień lub w wdrożenie Twojego dostawcy.

P: ok, ale skąd mam wiedzieć, kiedy wezwanie do aktualizacji?

O: dobre pytanie. W Clickonce, gdy instalujesz nową wersję swojego zastosowanie, zastosowania wykryje go i automatycznie Uaktualnij ustawienia dla Ciebie w punkcie ustawienia są wczytane. In non-Clickonce przypadki, nie ma automatycznej aktualizacji - sam musisz zadzwonić do Upgrade. Oto jeden z pomysłów na ustalenie, kiedy na call Upgrade:

Mieć ustawienie logiczne o nazwie CallUpgrade i dać mu domyślną wartość true. Po uruchomieniu aplikacji up, możesz zrobić coś takiego:

if (Properties.Settings.Value.CallUpgrade)
{
   Properties.Settings.Value.Upgrade();
   Properties.Settings.Value.CallUpgrade = false;    
}

To zapewni, że Upgrade () jest wywołane tylko po raz pierwszy aplikacja działa po nowej wersji jest rozmieszczony.

Nie wierzę ani przez sekundę, że to może faktycznie działać - nie ma mowy, aby Microsoft dostarczył tę zdolność, ale metoda jest tam po prostu taka sama.

 80
Author: Ian Boyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-09 01:13:56

Użytkownik.plik konfiguracyjny jest przechowywany w

c:\Documents and Settings>\<username>\[Local Settings\]Application Data\<companyname>\<appdomainname>_<eid>_<hash>\<verison>

<c:\Documents and Settings> jest katalogiem danych użytkownika, nie roamingowym (Ustawienia lokalne powyżej) lub roamingowym.
<username> jest nazwą użytkownika.
<companyname> jest wartością CompanyNameAttribute, jeśli jest dostępna. W przeciwnym razie Zignoruj ten element.
<appdomainname> jest AppDomain.CurrentDomain.Przyjacielskie imię. Zwykle jest to domyślne .nazwa exe.
<eid> jest adresem URL, StrongName lub ścieżką, opartą na dowodach dostępnych dla hash.
<hash> is a SHA1 hash of dowody zebrane z Aktualnej domeny, w następującej kolejności preferencji:
1. StrongName
2. URL:
Jeśli żaden z nich nie jest dostępny, użyj .ścieżka exe.
<version> jest ustawieniem AssemblyInfo AssemblyVersionAttribute.

Pełny opis jest tutaj http://msdn.microsoft.com/en-us/library/ms379611.aspx

 32
Author: Amr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-07 04:18:31

(dodałbym to jako komentarz do odpowiedzi @Amr, ale nie mam jeszcze wystarczająco reputacji, aby to zrobić.)

Informacje w artykule MSDN są bardzo jasne i wydają się nadal mieć zastosowanie. Nie wspomina jednak, że hash SHA1 jest zapisywany w zakodowanej bazie 32, a nie w bardziej typowej bazie 16.

Uważam, że używany algorytm jest zaimplementowany w ToBase32StringSuitableForDirName, który można znaleźć tutaj w Microsoft Reference Source .

 4
Author: JulianRendell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-25 08:57:51