2010-07-13 4 views
3

Installer class에서 파생 된 기존 (C# 기반) Windows 서비스가 있으며 현재는 제공된 MS 명령 줄 InstallUtil을 사용하여 설치하고 제거합니다. 이 잘 작동하며 내 시스템의 일부로 AfterUninstallEventHandler 및 CommittedEventHandler 이벤트에 이벤트 처리기를 연결했습니다. 필자의 경우에는 단순히 사용자 정의 이벤트 로그에 메시지를 로깅하는 데 사용하여 설치 및 제거 날짜와 시간 및 프로그램 버전을 보여줍니다.WiX 서비스 설치 관리자 및 사용자 정의 설치 이벤트

지금은 Wix v3.5 Beta 1을 사용하여이 서비스를 포함한 많은 것을 포장하고 있으며, 제가 수동으로 InstallUtil을 대체하기 위해 Wix ServiceInstall과 ServiceControl을 사용하고 있습니다.

그러나 Wix는 서비스 설치를 위해 InstallUtil과 완전히 다른 메커니즘을 사용하는 것으로 보입니다. 이것은 Wix (서비스 프로그램에 포함 된 것과는 대조적으로)가 제어하는 ​​서비스의 이름과 설명에 나타나며 내 이벤트는 더 이상 실행되지 않습니다 (다른 설치 메커니즘이 사용되는 경우에는).

그래서 InstallUtil과 같은 방식으로 서비스 설치를 수행 할 수 있습니까? 아니면 차이점을 설명하겠습니까? 크리스토퍼는 인수 분해 밖으로 내 코드에서 서비스와 관련된 정의를 제안하고 윅스 설치 프로젝트로 이동했다

편집. 이것은 내가 두 가지 분리 된 시스템 사이에서 정보를 공유하는 방법을 찾아야하거나 (코드와 윅스 프로젝트를 어떻게 공유할지 모르는) 방법을 찾아야하거나, 정보를 두 개의 분리 된 위치 소프트웨어 연습).

+0

그런 다음 설치 프로그램에서 레지스트리 키 또는 app.config에 이벤트 원본의 이름을 저장하고 서비스에서 해당 값을 읽고 이벤트 로그에 액세스하도록하십시오. 나는 정말로 "매우 나쁜 소프트웨어"관행을 보지 못했다. 설치 프로그램이 이벤트 소스 "x"를 만들고 서비스가 "x"에 작성하는 서비스와 설치 프로그램 사이의 계약 일뿐입니다. 결국 이들은 MSI가 잘 처리하는 레지스트리 항목 일뿐입니다. 나쁜 습관은 MSI가 이것을 제외하고는 모든 일을하고 프로세스 코드를 사용하여 바퀴를 재발 명하는 것입니다. –

+0

마지막 생각 : 이벤트 로그에 쓴 winforms 앱이라고 가정 해 봅시다. 관리자가 MSI를 설치했지만 프로그램을 실행 한 적이 없다고 가정 해 봅시다. 그런 다음 비 관리자가 프로그램을 시작했습니다. 이벤트 소스를 만들 수있는 권한은 어떻게 갖게됩니까? 그러나 MSI가 이벤트 소스를 생성하면 가능할 것입니다. –

+0

좋아 .. 계약자로서 내 설치자와 서비스 사이의 관계를 설명하는 것은 나에게 도움이되는 아이디어 였고 (나는 그것에 동의한다) 그러나 내가 가지고있는 이슈를 고착 시키는데 도움이된다. 이것은 비공식 계약이다. (레지스트리 키가 계약 당사자간에 정렬되도록하려면 어떻게해야합니까?).InstallUtil 메서드는 실패하는 경향이있는 끔찍한 해킹 일 수도 있지만 필자의 경우 기본적으로 한 위치에서만 정의되는 정보 임에도 불구하고보다 공식적인 계약을 시행 할 수 있습니다. 그러나 BTW 나는 귀하의 의견에 감사 드리며 도움이됩니다! –

답변

2

Windows Installer 관점에서 InstallUtil은 깨지기 쉬운 프로세스 코드를 선언적 프로그래밍 모델에 삽입하기 때문에 악의 반 패턴입니다. Windows Installer는 오랫동안 ServiceInstall 및 ServiceControl 테이블을 보유하고 있으며 실제로 잘 작동합니다. Regasm 및 Regserver에도 동일하게 적용됩니다. 우리는 COM 데이터를 추출하여 설치 프로그램에 작성한 다음 MSI가 어셈블리를로드하는 대신 레지스트리 값을 적용하고 작동하도록 희망 사항에 진입 점을 호출하는 방법을 선호합니다. 실패 할 경우 이유를 알 수 없으며 기계 상태를 롤백 할 수 없습니다.

이벤트에서 어떤 일을하고 계십니까? 나는 각각을 MSI가 할 수있는 일로 제거하거나 리팩터링 할 것입니다. 여전히 충분하지 않다면 DTF 사용자 지정 작업을 작성하고 InstallServices와 StartServices 사이에서 일정을 잡으십시오.

+0

나는 당신이 말하는 것을 이해하지만 그러한 방식으로 InstallUtil을 비방 할 배경이 없습니다. 그러나 제가 그립을 갖기 위해 얻지 못한 것은 당신이 제안한 해결책의 효과입니다. 커스텀 메소드를 만들면 이제 Wix *와 * my Service는 내 전용 이벤트 로그의 이름을 알아야합니다. 서버 코드의 이름을 Wix 표현식으로 내보내는 방법을 보여줄 수 없으므로 정의 할 필요가 있습니다. 이름은 2 개소에 있습니다. 나쁜 코드는 나쁜 코드! 이것은 내가 Wix (그리고 나는 msi라고 생각한다) 프로젝트와 관련된 일반적인 문제이다. 단기간에 나는 응용 프로그램과 같은 표준 이벤트 로그 이름에 쓸 수 있습니다. –

+0

14 년 동안 설치를 해왔습니다. 그 중 7 번은 MSI였습니다. Google 내 이름과 내 작품의 몸을 볼 수 있습니다 - 나는 전문가이며 InstallUtil은 짜증나. 나를 믿으십시오. MSI는 스크립트 기반 instalers로부터 큰 발전을 가져 왔으며, DevDiv가 떠나서 바퀴를 재발 명하기 전에 MSI의 패턴이 주위에있었습니다. 또한 MSI는 CLR보다 오래 전에 존재했던 관리되지 않는 서비스를 지원해야합니다. 코드에서 수행하는 유일한 방법으로 이벤트 로그를 만드는 경우 WiX에서 쉽게 수행 할 수 있습니다. http://stackoverflow.com/questions/58538/how-do-you-create-an-event-log-source-using-wix –

+0

설치 프로그램을 빌드하고 ORCA의 MSI를 보면 이것은 이벤트 로그와 소스를 정의하는 데 사용되는 레지스트리 키/값의 구문 통칭 설탕입니다. BTW WiX와 서비스가 이벤트 로그 이름을 SoC 관심사로 알고있는 것을 보지 못했습니다. 응용 프로그램을 설치하는 것은 설치 프로그램 작업이며 응용 프로그램을 설치하지 않고 실행하는 것은 응용 프로그램 작업입니다. –