윈도우인스톨러로 파일업데이트 시 실행중메세지

안녕하세요.
c# setup project를 통해 프로젝트를 msi파일로 배포하려고합니다. 다만 배포폴더내에 윈도우서비스가 포함되어 있고 커스텀액션을 통해 설치가 완료되면 서비스가 자동실행되도록(부팅시에도) 구성되어 있습니다.

여기서 removepreviousversion을 체크해서 셋업의 버전이 올라갈 경우 이전버전을 삭제하고 업데이트하는데 윈도우서비스가 실행중인 상태이다보니 정보를수집중… 단계에서 윈도우서비스가 실행중이라며 제대로 업데이트가 되지않습니다.

이를 우회해보기 위해서 윈도우서비스 내에서 msiexec.exe 프로세스가 시작할 경우의 이벤트를 캐치해서 서비스를 중지시키도록 했으나 문제는 해당 셋업파일이 아닌 다른 msi파일을 실행시켜도 윈도우서비스가 멈춘다는 점입니다

msiexec.exe의 모듈이름을 가져와도 ex) 바탕화면₩setup.msi 가 아닌 System32₩msiexec.exe 이런식으로 떠서 해당 셋업인지 체크하기가 어렵습니다.

위 문제에 대한 아이디어나 원초적인 문제를 해결할 만한 방법을 얻고싶습니다… 머리를 굴려봐도 역부족이네요

2 Likes

[OnBeforeInstall(IDictionary)] 이벤트 에서 구동 중인 서비스를 stop 시키고 진행 하면 되지 않나요 ?

2 Likes

말씀해주신방법대로 beforeinstall이나 uninstall에 추가해도 윈도우인스톨러에서 해당 함수에 접근하기전에
필요한 정보를 수집중… 이라는 박스에서 먼저 실행중인걸 체크합니다…

2 Likes

프로젝트에는 ProjectInstaller 클래스가 자동으로 생성되어 있을 것입니다
ProjectInstaller.cs 파일에서 Installer 클래스를 상속받아서 BeforeInstall 메서드를 오버라이드합니다.
이곳에서 서비스 중지와 다른 설정을 수행할 수 있습니다.

[RunInstaller(true)]
public partial class ProjectInstaller : Installer
{
    public ProjectInstaller()
    {
        InitializeComponent();
    }

    protected override void OnBeforeInstall(IDictionary savedState)
    {
        base.OnBeforeInstall(savedState);

        // 기존 서비스 중지
        StopService("YourServiceName");
    }
}
2 Likes

말씀드렸다시피 예전에 시도해본 방법입니다
메시지박스 띄워서 실제로 호출되는지도 확인했어요

  1. 필요한 정보를 수집중
  2. beforeinstall
  3. install
  4. afterinstall

인데 2번에 아무리 서비스를 중지해봤자
1번에서 실행중을 체크하니 무의미해서 다른 방법으로 찾아본겁니다

2 Likes

.net - Upgrade a Windows Service without Uninstalling - Stack Overflow

1 Like