2013-05-14 4 views
3

Wix로 만든 MSI에서 Uninstall을 실행할 때 파일을 삭제하기 전에 백그라운드에서 실행중인 프로세스를 강제 종료해야합니다. 메인 어플리케이션은 bg-process 모니터링 로컬 윈도우 서비스의 상태를 반영하는 트레이시콘으로 구성되어 있습니다 (C#으로 작성되었지만 이것은 더 이상 관련이 없습니다). Wix : 강제로 프로세스/작업을 죽이는 방법은 무엇입니까?

내가 먼저 다음 시도 :

<File Id='FooEXE' Name='Foo.exe' Source='..\Source\bin\Release\Foo.exe' Vital='yes' />  
... 
<InstallExecuteSequence> 
    <Custom Action="CloseTray" Before="InstallValidate" /> 
</InstallExecuteSequence> 
... 
<CustomAction Id="CloseTray" ExeCommand="-exit" FileKey="FooEXE" Execute="immediate" Return="asyncWait" /> 

트레이 아이콘이 즉시 응용 프로그램 닫기 대화 상자를 확인한 후 폐쇄,하지만 제거가 완료된 후에서 foo.exe 작업은 여전히 ​​taskmgr을에 나타납니다. 또한, 다음과 같은 에러 메시지가 주어졌다 :

Error Message #1

한게 이유는 다음 I이 시도 : 동일한 결과를 얻은 후

<InstallExecuteSequence> 
    <Custom Action="Foo.TaskKill" Before="InstallValidate" /> 
</InstallExecuteSequence> 
... 
<CustomAction Id="Foo.TaskKill" Impersonate="yes" Return="asyncWait" Directory="WinDir" ExeCommand="\System32\taskkill.exe /F /IM Foo.exe /T" /> 

을 시도 :

<Property Id="QtExecCmdLine" Value='"[WinDir]\System32\taskkill.exe" /F /IM Foo.exe'/> 
... 
<InstallExecuteSequence> 
    <Custom Action="MyProcess.TaskKill" Before="InstallValidate" /> 
</InstallExecuteSequence> 
... 
<CustomAction Id="MyProcess.TaskKill" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="immediate" Return="ignore"/> 

샘플 된 나는 여기에서 가져 갔다 : How to kill a process from WiX

Error #2, What am I doing wrong here?

나는이 명예의 동상을 구축 생각하고 있어요 :

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"> 
... 
<InstallExecuteSequence> 
<Custom Action="WixCloseApplications" Before="InstallValidate" /> 
</InstallExecuteSequence> 
... 
<util:CloseApplication Id="CloseFoo" CloseMessage="yes" Description="Foo is still running!" ElevatedCloseMessage="yes" RebootPrompt="yes" Target="Foo.exe" /> 

이 하나가 나에게 다른 오류를 준 모든 다른 실패 최근에 때, 나는 또한 어떤 성공없이 시도 그냥 죽기를 거절하는 과정! ... 그 중 하나 또는 응용 프로그램 측면에서 문제가 있다고 생각 어디 Application.Exit(); 또는 Environment.Exit (0); Program.cs 내부의 일부 줄.

윅스 또는 내 응용 프로그램 중 하나를 제거 할 때 성공적으로 닫을 수있는 다른 방법이 있습니까? 감사합니다.

답변

3

개인적으로 가장 좋은 옵션은 이전 옵션보다 내장 된 CloseApplication 메서드입니다.

즉각적인 순서로 작업을 예약하려고하지만 연기 작업으로 트리거하는 ElevatedCloseMessage="yes" 집합이 있기 때문에 오류 (오류 코드 2762)가 발생했습니다. 이 속성을 제거하거나 연기 된 순서로 일정을 예약하십시오.

+0

글쎄, 그건 두 번째 문제를 해결 :) 감사합니다! 이제는 이들 중 어느 것도 작업을 죽이지 않고 살아남은 채로 남아 있지 않은지 알아야합니다. (여전히 taskmgr에 Foo.exe가 표시되고 첫 번째 오류 메시지가 표시됩니다.) – safejrz

+0

당신이 설치하고있는 앱을 실행하는 사용자는 누구입니까? 그렇지 않은 경우 시스템 계정이 프로세스를 종료하도록 지연된 동작으로 실행해야합니다. –

관련 문제