developer tip

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

optionbox 2020. 8. 18. 07:39
반응형

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


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

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

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

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

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


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

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

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

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

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


앞으로이 문제가 발생할 때 참조로이 인용 된 텍스트를 추가하고 싶었습니다. 업그레이드 를 호출하여 이전 버전의 설정을 복사하도록 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 ()가 호출됩니다.

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


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


(I'd add this as a comment to @Amr's answer, but I don't have enough rep to do that yet.)

The info in the MSDN article is very clear and appears to still apply. However it fails to mention that the SHA1 hash is written out base 32 encoded, rather than the more typical base 16.

I believe the algorithm being used is implemented in ToBase32StringSuitableForDirName, which can be found here in the Microsoft Reference Source.

참고URL : https://stackoverflow.com/questions/621265/can-i-control-the-location-of-net-user-settings-to-avoid-losing-settings-on-app

반응형