응용 프로그램 업그레이드시 설정이 손실되지 않도록 .NET 사용자 설정의 위치를 ​​제어 할 수 있습니까?


104

user.config파일 위치를 사용자 지정하려고 합니다. 현재 해시 및 버전 번호와 함께 저장됩니다.

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

나는 응용 프로그램의 버전에 무관심하고 싶습니다.

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

이것을 할 수 있고 어떻게 할 수 있습니까? 의미는 무엇입니까? 사용자가 업그레이드 후 이전 버전의 설정을 잃게 되나요?


uzbones의 대답은 파일 위치와 관련하여 유익한 반면 Ian 은 업그레이드와 관련하여 더 정확 하다고 생각합니다 .
Anthony Mastrean 2011-08-03

4
@AnthonyMastrean 개인적으로 중요한 설정은 Microsoft에서 제공 한 ApplicationSettings 인프라 에 의존해서는 안된다고 생각합니다 . Muxa는 %AppData%\[CompanyName]/[ProductName]우리가 신뢰할 수 있는 곳에 설정을 저장해야합니다 .
Ian Boyd

2
의심 할 여지없이, 내장 애플리케이션과 사용자 설정에 대한 나의 지속적인 경험은 끔찍했습니다. appdata 또는 programdata의 json 파일을 권장합니다.
Anthony Mastrean

설정을 레지스트리에 저장할 수도 있습니다. 대체 설정 클래스 구현 은 stackoverflow.com/a/12127888/1273550 을 참조하십시오 .
Ravi Patel

답변:


39

첫 번째 질문에 답하려면 기술적으로 원하는 위치에 파일을 넣을 수 있지만 파일이가는 기본 위치가 두 예제 중 첫 번째이므로 직접 코딩해야합니다. ( 직접하는 방법에 대한 링크 )

두 번째 질문은 응용 프로그램을 배포하는 방법에 따라 다릅니다. .msi를 통해 배포하는 경우 설치 프로젝트의 속성 (msi가 빌드 된 소스)에 '업그레이드 코드'와 '제품 코드'라는 두 개의 해시가 있습니다. 이는 msi를 설치할 수있는 방법과 동일한 응용 프로그램의 다른 버전과 함께 업그레이드, 덮어 쓰기 또는 설치하는지 여부를 결정합니다.

예를 들어, 두 가지 버전의 소프트웨어가 있고 서로 다른 '업그레이드'코드가있는 경우 이름이 무엇이든간에 Windows에서는 완전히 다른 소프트웨어 조각입니다. 그러나 '업그레이드'코드는 동일하지만 '제품'코드가 다른 경우 두 번째 msi를 설치하려고 할 때 업그레이드할지 묻는 메시지가 표시되며, 이때 해당 값을 복사해야합니다. 이전 구성에서 새 구성으로. 두 값이 동일하고 버전 번호가 변경되지 않은 경우 새 구성은 이전 구성과 동일한 위치에 있으며 아무것도 수행 할 필요가 없습니다. MSDN 문서

ClickOnce는 ClickOnce 버전 번호 및 URL 경로를 기반으로하기 때문에 약간 다릅니다. 그러나 동일한 위치에 '게시'를 계속하는 한 새 버전의 애플리케이션은 기존 구성. ( ClickOnce가 업데이트를 처리하는 방법에 대한 링크 )

또한 사용자 지정 설치 스크립트를 사용하여 msi를 설치하는 동안 구성을 수동으로 병합하는 방법이 있다는 것을 알고 있지만 정확한 단계를 기억하지 못합니다 ... ( 웹에서 수행하는 방법 은 링크를 참조하십시오 . 구성)


업그레이드 코드는 일정하게 유지되어야하는 코드이고 제품 코드는 릴리스간에 변경되어야하는 코드가 아닙니까? blogs.msdn.com/b/pusu/archive/2009/06/10/understanding-msi.aspx
estanford

도! 당신이 맞아요, 제가 그걸 거꾸로 잡았다는 게 믿기지 않아요 (그리고 그것을 잡는데 2 년이 걸렸습니다). 그것은 내 과거의 한 시점에서 잠시 동안 로보 사인과 같았습니다. :(
uzbones

이는 설치하는 사용자 만 설정을 업그레이드한다는 의미입니까?
Micha Wiedenmann

79

앞으로이 문제가 발생할 때 참조로이 인용 된 텍스트를 추가하고 싶었습니다. 업그레이드 를 호출하여 이전 버전의 설정을 복사하도록 ApplicationSettings 인프라에 지시 할 수 있습니다 .

Properties.Settings.Value.Upgrade();

에서 클라이언트 설정 자주 묻는 질문 블로그 게시물 : ( 아카이브 )

Q : user.config 경로에 버전 번호가있는 이유는 무엇입니까? 내 애플리케이션의 새 버전을 배포하면 사용자가 이전 버전에서 저장 한 모든 설정을 잃지 않습니까?

A : user.config 경로가 버전을 구분하는 데에는 몇 가지 이유가 있습니다.

(1) 여러 버전의 애플리케이션을 나란히 배포 할 수 있도록 지원합니다 (예 : Clickonce를 사용하여이 작업을 수행 할 수 있음). 다른 버전의 응용 프로그램에서 다른 설정을 저장할 수 있습니다.

(2) 응용 프로그램을 업그레이드 할 때 설정 클래스가 변경되어 저장된 항목과 호환되지 않아 문제가 발생할 수 있습니다.

그러나 이전 버전의 응용 프로그램에서 최신 버전으로 설정을 쉽게 업그레이드 할 수 있도록했습니다. ApplicationSettingsBase.Upgrade ()를 호출하기 만하면 현재 버전의 클래스와 일치하는 이전 버전의 설정을 검색하여 현재 버전의 user.config 파일에 저장합니다. 설정 클래스 또는 공급자 구현에서이 동작을 재정의하는 옵션도 있습니다.

Q : 좋습니다.하지만 언제 업그레이드에 전화해야하는지 어떻게 알 수 있습니까?

A : 좋은 질문입니다. Clickonce에서 애플리케이션의 새 버전을 설치하면 ApplicationSettingsBase가이를 감지하고 설정이로드 될 때 자동으로 업그레이드 설정을 업그레이드합니다. Clickonce가 아닌 경우에는 자동 업그레이드가 없습니다. Upgrade를 직접 호출해야합니다. 다음은 업그레이드 호출시기를 결정하는 한 가지 아이디어입니다.

CallUpgrade라는 부울 설정을 가지고 기본값을 true로 지정하십시오. 앱이 시작되면 다음과 같이 할 수 있습니다.

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

이렇게하면 새 버전이 배포 된 후 응용 프로그램이 처음 실행될 때만 Upgrade ()가 호출됩니다.

나는 그것이 실제로 작동 할 수 있다고 잠시 믿지 않는다. 마이크로 소프트가이 기능을 제공 할 방법은 없지만 방법은 똑같다.


3
이것은 완전히 작동합니다! 나는 단순한 if(CallUpgrade) { Upgrade(); }진술을 사용했다.
Anthony Mastrean 2011-08-03

@Ian Boyd : 저는이 아이디어가 마음에 들었고 잠재적 인 해결책에 대해 완전히 열광했지만 한 가지에 대해 혼란 스럽습니다. 나는이없는 Properties.Settings.Value 나는이 Properties.Settings부분을하지만 난 뭔가를 놓치고 또는 당신에게 특정입니까?
Refracted Paladin 2011 년

8
이것은 잘 작동하지만 독자들에게 구성 경로가 버전 번호를 제외하고 동일해야 함을 상기시킵니다. 즉 @Amr의 대답을 참조하십시오. 예를 들어 앱의 새 버전이 이전 버전과 다른 파일 경로에서 실행되면 Upgrade작동하지 않습니다.
스티븐 Swensen

1
그것의 @RefractedPaladinProperties.Settings.Default.Upgrade()
스티븐 Swensen

5
Properties.Settings.Default.Save();false로 변경 한 후 추가 하는 것을 잊지 마십시오. :-)
Jeff

32

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 또는 경로입니다.
<hash>다음 기본 설정 순서로 CurrentDomain에서 수집 한 증거의 SHA1 해시입니다.
1. StrongName
2. URL :
둘 다 사용할 수없는 경우 .exe 경로를 사용합니다.
<version>AssemblyInfo의 AssemblyVersionAttribute 설정입니다.

전체 설명은 여기에 있습니다 http://msdn.microsoft.com/en-us/library/ms379611.aspx


4

(나는 이것을 @Amr의 답변에 대한 코멘트로 추가하고 싶지만 아직 그렇게 할 충분한 담당자가 없습니다.)

MSDN 기사정보 는 매우 명확하며 여전히 적용되는 것으로 보입니다. 그러나 SHA1 해시가 더 일반적인 16 진법이 아니라 32 진법으로 인코딩된다는 사실은 언급하지 않습니다.

나는에 구현되어 사용되는 알고리즘 믿고 ToBase32StringSuitableForDirName, 은 Microsoft 참조 원본에 여기에서 찾을 수 있습니다을 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.