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

StackOverflow https://stackoverflow.com/questions/621265

  •  05-07-2019
  •  | 
  •  

문제

나는 위치를 사용자 정의하려고합니다 user.config 파일. 현재 해시와 버전 번호로 저장됩니다.

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

응용 프로그램 버전에 적절하지 않기를 원합니다.

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

이 작업을 수행 할 수 있습니까? 그 의미는 무엇입니까? 업그레이드 후 사용자가 이전 버전에서 설정을 잃게됩니까?

도움이 되었습니까?

해결책

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

두 번째 질문은 응용 프로그램을 배포하는 방법에 따라 다릅니다. .MSI를 통해 배포되면 설정 프로젝트의 속성 (MSI가 구축 된), '업그레이드 코드'및 '제품 코드'에 두 개의 해시가 있습니다. 이는 MSI를 설치하는 방법을 결정하고 동일한 응용 프로그램의 다른 버전 옆에 업그레이드, 덮어 쓰기 또는 설치하는 경우를 결정합니다.

예를 들어, 두 가지 버전의 소프트웨어가 있고 다른 '업그레이드'코드가있는 경우 Windows에 이름이 무엇인지에 관계없이 완전히 다른 소프트웨어입니다. 그러나 '업그레이드'코드가 동일하지만 '제품'코드가 다르면 두 번째 MSI를 설치하려고 할 때 업그레이드 할 것인지 묻습니다. 새 구성에 대한 오래된 구성. 두 값이 모두 동일하고 버전 번호가 변경되지 않으면 새 구성이 이전 구성과 동일한 위치에 있으므로 아무것도 수행 할 필요가 없습니다. MSDN 문서

ClickOnce는 ClickOnce 버전 # 및 URL 경로를 기반으로하기 때문에 약간 다르지만, 동일한 위치에 계속 '게시'하는 한 새 버전의 응용 프로그램이 계속 사용할 것임을 알게되었습니다. 기존 구성. (ClickOnce가 업데이트를 처리하는 방법에 대한 링크)

또한 사용자 정의 설치 스크립트를 사용하여 MSI를 설치하는 동안 구성을 수동으로 병합하는 방법이 있다는 것을 알고 있지만 정확한 단계는 기억 나지 않습니다 ... (참조. 이것 Web.config로 수행하는 방법에 대한 링크)

다른 팁

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

Properties.Settings.Value.Upgrade();

에서 클라이언트 설정 FAQ 블로그 게시물: (보관소)

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

A : user.config 경로가 버전에 민감한 이유는 몇 가지가 있습니다.

(1) 다른 버전의 애플리케이션을 나란히 배포하기 위해 (예를 들어 ClickOnce를 사용하여이를 수행 할 수 있음). 응용 프로그램의 다른 버전이 다른 설정을 저장할 수 있습니다.

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

그러나 이전 버전의 응용 프로그램에서 최신 버전으로 설정을 쉽게 업그레이드 할 수있었습니다. 단순히 전화하십시오 ApplicationSettingsbase.upgrade () 클래스의 현재 버전과 일치하는 이전 버전에서 설정을 검색하고 현재 버전의 user.config 파일에 저장합니다. 또한 설정 클래스 또는 제공 업체 구현 에서이 동작을 재정의 할 수 있습니다.

Q : 좋아,하지만 업그레이드를 언제 호출 해야하는지 어떻게 알 수 있습니까?

A : 좋은 질문. ClickOnce에서는 새 버전의 응용 프로그램을 설치하면 ApplicationSettingSbase가이를 감지하고 포인트 설정에서 설정을 자동으로 업그레이드합니다. 비 클릭 비전의 경우 자동 업그레이드가 없습니다. 업그레이드를 직접 호출해야합니다. 다음은 업그레이드 호출시기를 결정하기위한 한 가지 아이디어입니다.

Callupgrade라는 부울 설정을 가지고 기본값의 true를 제공하십시오. 앱이 시작되면 다음과 같은 작업을 수행 할 수 있습니다.

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

이렇게하면 새 버전을 배포 한 후에는 Application ()가 처음으로 실행되는 경우에만 업그레이드 ()가 호출됩니다.

나는 그것이 실제로 작동 할 수 있다고 잠시 믿지 않습니다. Microsoft 가이 능력을 제공 할 방법은 없지만 방법은 동일합니다.

user.config 파일이 저장됩니다

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

<c:\Documents and Settings> 사용자 데이터 디렉토리, 비 로밍 (위의 로컬 설정) 또는 로밍입니다.
<username> 사용자 이름입니다.
<companyname> 사용 가능한 경우 CompanyManeatTribute 값입니다. 그렇지 않으면이 요소를 무시하십시오.
<appdomainname> AppDomain.currentDomain.frierdlyName입니다. 이것은 일반적으로 기본값이 .exe 이름으로 나타납니다.
<eid> 해시가 이용할 수있는 증거를 기반으로 URL, StrongName 또는 Path입니다.
<hash> 다음과 같은 선호의 순서대로 현재 도메인에서 수집 된 증거의 SHA1 해시입니다.
1. StrongName
2. URL :
이 중 어느 것도 사용할 수 없다면 .exe 경로를 사용하십시오.
<version> AssemblyInfo의 AssemblyVersionattribute 설정입니다.

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

(나는 이것을 @amr의 답변에 댓글로 추가했지만 아직 그렇게 할 수있는 반복이 충분하지 않습니다.)

그만큼 MSDN 기사의 정보 매우 명확하고 여전히 적용되는 것으로 보입니다. 그러나 SHA1 HASH가보다 일반적인베이스 16이 아닌 인코딩 된베이스 32에 기록된다고 언급하지 못한다.

사용되는 알고리즘이 구현 된 것으로 생각합니다 ToBase32StringSuitableForDirName, 어느 여기에서 Microsoft Reference 소스에서 찾을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top