6

VS2005를 사용하여 C#으로 작성된 Windows 서비스가 있습니다.VS2005 msi를 업그레이드하도록 설득하려면 어떻게합니까?

설치는 VS2005를 사용하여 만든 msi 파일을 설치하기 위해 msiexec를 호출하는 마법사를 통해 수행됩니다.

서비스의 한 버전에서 다른 버전으로 업그레이드하는 msi 파일을 생성하는 데 문제가 있습니다. 마법사 프로그램은 현재 설치된 버전의 검색, 서비스 중지, msiexec에 대한 적절한 명령 줄 사용 및 서비스 재시작을 처리합니다.

기존 msi의 버전 속성은 1.1.02이고 새 버전은 1.1.03입니다. 제품 및 업그레이드 코드는 동일합니다.

프로그램 추가/제거를 통해 수동으로 1.1.02를 제거하면 "깨끗한"시스템에 1.1.03을 설치할 때와 마찬가지로 잘 작동합니다.

1.1.02에서 1.1.03으로 업그레이드하면 동작하지만 최종 결과는 1.1.02입니다. 마법사가 업그레이드에 사용

명령 줄은 다음과 같습니다

에 msiexec/QB/I "MyProduct.msi"REINSTALL = "ALL"REINSTALLMODE = "VOS"

는 어디서 잘못된 것입니까? 나는 상당히 근본적인 무언가를 놓쳐 버렸음에 틀림 없다고 가정하고있다. ...

폴백 위치는 1.1.02를 설치하기 위해 마법사를 실행하기 전에 1.1.02를 수동으로 제거해야한다는 것을 고객에게 알리는 것이다. 그럴 필요가 없습니다.

추가 편집 :

이 (VS2005는 프롬프트로 당신이) 실제로 설치는 제품 코드 여태 경우 재설치를하지 못하게 그것으로, 모든 업그레이드 할 수있는 능력을 제거하는 제품 코드 변경 이전에 설치되었습니다.

모두 당신이 할 수있게 할 것입니다 설치 (그리고 당신은 보통의 "서비스가 이미 존재"- 타입 메시지).

답변

8

이전 버전을 자동으로 제거하려면 MSI에서 작동하도록 "업그레이드"를 수행해야하는 몇 가지 사항이 있습니다.

신비한 "코드"에 대한 배경 정보. - 이것은 MSI 설치 프로그램의 특정 버전을 식별하고 전역 재사용하지 빌드 안됩니다

  1. 패키지 코드 : MSI는과 관련된 3 개 코드 (GUID의)이 있습니다. 항상 업데이트해야합니다.
  2. 제품 코드 -이 식별자는 특정 버전의 응용 프로그램을 식별하는 데 사용됩니다. 설치 프로그램 작성자는 새 제품 코드를 할당 할시기를 결정해야합니다.
  3. 업그레이드 코드 -이 응용 프로그램을 식별하고 수명

은 절대 변하지 않을해야하는 업그레이드 코드의를 통해 변경해서는 안됩니다. Scenerio를 업그레이드하려면 각 버전마다 제품 코드를 변경해야합니다. 또한 언급 한 바와 같이 버전 번호를 지정해야합니다.제품 코드업그레이드 코드은 설치 프로젝트를 선택하고 속성 창으로 이동하여 찾을 수 있습니다. 패키지 코드은 Studio에서 숨겨져 있으며 항상 업데이트됩니다.

누락 된 항목은 속성 창에서 RemovePreviousVersions 설정을 으로 설정해야한다는 것입니다.

제대로 업그레이드하는 사용자의 기본 출력 (! 당신의 EXE) 위해서는

, 당신이 증가해야하는 파일 버전

이 설정 (비주얼 스튜디오 2008)

6

외에 한 가지 더 mohlsen 수의 대답 응용 프로그램 탭 -> 어셈블리 정보

+0

예 - 설정을 확인했습니다. 결국이 부분을 포기하고 이미 이전 버전이 발견되면 새로 설치 한 다음 제거 마법사를 수행합니다. 정상적으로 작동하는 것으로 보이며 수동으로 아무 것도하지 않아도 최종 사용자가 업그레이드 할 수 있습니다. –

+0

또한 제가 만들 수있는 한 비주얼 스튜디오에서 제작 한 MSI는 어쨌든 서비스 업그레이드를 허용하지 않는 것으로 유명하기 때문에 마법사의 작업을 통해 다음 트랩에 빠지는 것을 피할 수 있습니다. –

+0

+1하지만 완전히 명확하게하기 위해 이것은 MAIN 프로젝트의 파일 버전을 업그레이드하는 것입니다 (설치 프로젝트가 아닙니다!). –

2

더 쉬운 방법은 AssemblyFileVersion을 주 실행 파일과 모든 관리 DLL을 포함하여 모든 어셈블리에서 제거하는 것입니다.

각 AssemblyInfo.cs 파일에서 버전 번호는 신경 쓰지 않지만 추적 가능성을 갖고 싶다면 다음과 같이하십시오.

[assembly: AssemblyVersion("1.1.*")] 
// don't need this [assembly: AssemblyFileVersion("1.0.0.0")] 

모든 여전히 잘 컴파일하고 AssemblyFileVersion 정의하지 않는 경우, 설치 프로그램은 모든 사용자가 모든 DLL을 설치하는 경우 아마 잘 될 때마다 (다음 주에 차이가 있다고 가정 EXE).

나는 이것을 알아 내기 위해 오랜 시간을 보냈는데, 특히 수동으로 아무것도 늘리지 않기를 바랬다면!

관련 문제