Uygulama yükseltmesi sırasında ayarları kaybetmemek için .NET kullanıcı ayarlarının konumunu kontrol edebilir miyim?


104

user.configDosyanın konumunu özelleştirmeye çalışıyorum . Şu anda bir karma ve sürüm numarasıyla saklanıyor

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

Uygulamanın sürümünden bağımsız olmasını istiyorum

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

Bu yapılabilir mi ve nasıl? Çıkarımlar neler? Kullanıcı, yükseltmeden sonra önceki sürümdeki ayarlarını kaybedecek mi?


Uzbones'in cevabı dosya konumu konusunda bilgilendirici olsa da , Ian'ın yükseltme konusunda daha doğru olduğuna inanıyorum .
Anthony Mastrean

4
@AnthonyMastrean Kişisel olarak, önemli ayarların Microsoft'um tarafından sağlanan ApplicationSettings altyapısına dayanmaması gerektiğini düşünüyorum . Muxa, ayarları %AppData%\[CompanyName]/[ProductName]kalacağına güvenebileceğimiz bir yerde saklamalı .
Ian Boyd

2
Şüphesiz, yerleşik uygulama ve kullanıcı ayarlarıyla ilgili devam eden deneyimim korkunçtu. Json dosyalarını appdata veya programdata'da öneririm.
Anthony Mastrean

Ayarlarınızı bir kayıt defterinde de saklayabilirsiniz. Alternatif ayarlar sınıfı uygulaması için stackoverflow.com/a/12127888/1273550 adresine bakın .
Ravi Patel

Yanıtlar:


39

İlk soruyu cevaplamak için, dosyayı teknik olarak istediğiniz yere koyabilirsiniz, ancak dosyanın gideceği varsayılan yer iki örneğinizden ilki olduğundan dosyayı kendiniz kodlamanız gerekir. ( kendiniz nasıl yapacağınıza ilişkin bağlantı )

İkinci soruya gelince, uygulamayı nasıl dağıttığınıza bağlıdır. Bir .msi aracılığıyla dağıtırsanız, kurulum projesinin özelliklerinde (msi'nin oluşturulduğu) iki karma vardır, "yükseltme kodu" ve "ürün kodu". Bunlar, msi'nin nasıl kurulacağını ve aynı uygulamanın başka herhangi bir sürümünün yanında yükseltilip yükseltilmeyeceğini, üzerine yazılacağını veya kurulacağını belirler.

Örneğin, yazılımınızın iki sürümüne sahipseniz ve bunlar farklı 'yükseltme' kodlarına sahipse, o zaman Windows için bunlar, adı ne olursa olsun tamamen farklı yazılım parçalarıdır. Bununla birlikte, 'yükseltme' kodu aynıysa, ancak 'ürün' kodu farklıysa, 2. msi'yi yüklemeye çalıştığınızda, yükseltmek isteyip istemediğinizi soracaktır, bu sırada değerleri kopyalamak isteyip istemediğinizi soracaktır. eski yapılandırma yeni bir yapılandırmaya. Her iki değer de aynıysa ve sürüm numarası değişmediyse, yeni yapılandırma eski yapılandırma ile aynı konumda olacaktır ve herhangi bir şey yapması gerekmeyecektir. MSDN Belgeleri

ClickOnce biraz farklıdır, çünkü ClickOnce sürüm numarası ve URL yoluna dayanmaktadır, ancak aynı konumda 'Yayınlamaya' devam ettiğiniz sürece uygulamanın yeni sürümünün mevcut yapılandırma ( ClickOnce'un güncellemeleri nasıl işlediğine ilişkin bağlantı )

Ayrıca, özel yükleme komut dosyalarını kullanarak msi yüklemesi sırasında yapılandırmaları manuel olarak birleştirmenin bir yolu olduğunu da biliyorum, ancak bunu yapmak için tam adımları hatırlamıyorum ... ( bir web ile nasıl yapılacağı için bu bağlantıya bakın . yapılandırma)


Sabit kalması gereken yükseltme kodu ve sürümler arasında değişmesi gereken ürün kodu değil mi? blogs.msdn.com/b/pusu/archive/2009/06/10/understanding-msi.aspx
estanford

Doh! haklısın, bunu tersine çevirdiğime inanamıyorum (ve onu yakalamam 2 yıl sürdü). Geçmişimde bir noktada robo-imzalamak gibiydi :(
uzbones

Bu, yalnızca yükleyen kullanıcının ayarlarını yükselteceği anlamına mı geliyor?
Micha Wiedenmann

79

İleride bu problemi yaşadığımda bu alıntılanan metni referans olarak eklemek istedim. Sözde, Yükseltme'yi çağırarak ApplicationSettings altyapısına önceki bir sürümden ayarları kopyalamasını isteyebilirsiniz :

Properties.Settings.Value.Upgrade();

Gönderen Müşteri Ayarları SSS blog post: ( arşiv )

S: user.config yolunda neden bir sürüm numarası var? Uygulamamın yeni bir sürümünü dağıtırsam, kullanıcı önceki sürümde kaydedilen tüm ayarları kaybetmez mi?

Y: user.config yolunun sürüme duyarlı olmasının birkaç nedeni vardır.

(1) Bir uygulamanın farklı sürümlerinin yan yana dağıtımını desteklemek için (bunu örneğin Clickonce ile yapabilirsiniz). Uygulamanın farklı sürümlerinde farklı ayarların kaydedilmiş olması mümkündür.

(2) Bir uygulamayı yükselttiğinizde, ayarlar sınıfı değiştirilmiş olabilir ve kaydedilenlerle uyumlu olmayabilir, bu da sorunlara yol açabilir.

Ancak, uygulamanın önceki bir sürümünden en son sürüme ayarları yükseltmeyi kolaylaştırdık. Basitçe ApplicationSettingsBase.Upgrade () 'i çağırın ve sınıfın mevcut sürümüyle eşleşen önceki sürümden ayarları alacak ve bunları geçerli sürümün user.config dosyasında depolayacaktır. Ayrıca, ayarlar sınıfınızda veya sağlayıcı uygulamanızda bu davranışı geçersiz kılma seçeneğiniz de vardır.

S: Tamam, ama Yükseltmeyi ne zaman arayacağımı nasıl bileceğim?

C: Güzel soru. Clickonce'da, uygulamanızın yeni bir sürümünü kurduğunuzda, ApplicationSettingsBase onu algılar ve ayarlar yüklendiği noktada ayarları sizin için otomatik olarak yükseltir. Clickonce olmayan durumlarda, otomatik yükseltme yoktur - Yükseltmeyi kendiniz aramanız gerekir. Yükseltmenin ne zaman çağrılacağını belirlemek için işte bir fikir:

CallUpgrade adlı bir boole ayarına sahip olun ve buna varsayılan bir true değeri verin. Uygulamanız başladığında aşağıdaki gibi bir şey yapabilirsiniz:

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

Bu, Upgrade () işlevinin yalnızca uygulama yeni bir sürüm dağıtıldıktan sonra ilk kez çalıştırıldığında çağrılmasını sağlayacaktır.

Bunun gerçekten işe yarayacağına bir an bile inanmıyorum - Microsoft'un bu yeteneği sağlamasının bir yolu yok, ancak yöntem orada da aynı.


3
BU TAMAMEN ÇALIŞIYOR! Ben sadece basit if(CallUpgrade) { Upgrade(); }ifadeyi kullandım.
Anthony Mastrean

@ Ian Boyd: Bu fikri beğendim ve potansiyel bir çözüme sahip olduğum için çok heyecanlıyım ancak bir konuda kafam karıştı. Ben yok Properties.Settings.Value Ben Properties.Settingskısmını ama bir şey eksik ya da size özel olan?
Kırılma Paladin

8
Bu iyi çalışıyor, ancak okuyuculara sürüm numarası hariç yapılandırmanın yolunun aynı olması gerektiğini hatırlatırım. yani @ Amr'ın cevabına bakınız. örneğin, uygulamanın yeni bir sürümü önceki bir sürümden farklı bir dosya yolundan başlatılırsa Upgradeçalışmaz.
Stephen Swensen

1
@RefractedPaladin It'sProperties.Settings.Default.Upgrade()
Stephen Swensen

5
Properties.Settings.Default.Save();Yanlış olarak değiştirdikten sonra eklemeyi unutmayın :-)
Jeff

32

User.config dosyası şu adreste saklanır:

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

<c:\Documents and Settings>kullanıcı verileri dizinidir; dolaşım dışı (yukarıdaki Yerel Ayarlar) veya dolaşımda.
<username>kullanıcı adıdır.
<companyname>Varsa CompanyNameAttribute değeridir. Aksi takdirde, bu öğeyi göz ardı edin.
<appdomainname>AppDomain.CurrentDomain.FriendlyName'dir. Bu genellikle varsayılan olarak .exe adıdır.
<eid>hash için mevcut kanıta dayalı URL, StrongName veya Path.
<hash>CurrentDomain'den aşağıdaki tercih sırasına göre toplanan kanıtın SHA1 karmasıdır:
1. StrongName
2. URL:
Bunların hiçbiri yoksa, .exe yolunu kullanın.
<version>AssemblyInfo'nun AssemblyVersionAttribute ayarıdır.

Tam açıklama burada http://msdn.microsoft.com/en-us/library/ms379611.aspx


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.