2013-08-01 3 views
0

지연된 사용자 지정 작업에서 설치 위치 속성을 가져올 수 없습니다 InstallDir - PRIMARYFOLDER 대신에 http://blogs.technet.com/b/alexshev/archive/2008/03/25/property-does-not-exist-or-empty-when-accessed-from-deferred-custom-action.aspx내가 링크 읽은 후이 코드를 작성했습니다

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Module Id="MergeModule1" Language="1033" Version="1.0.0.0"> 
    <Package Id="cffa568e-1bf0-4eb3-bee3-eb5801a0bbd0" Manufacturer="Microsoft" InstallerVersion="200" /> 

    <Binary Id="myCustomActionsDLL" SourceFile="CustomAction1.CA.dll" /> 

    <CustomAction Id="SetProperty" Execute="immediate" 
        Property="CA_myCustomAction" 
        Value="InstallDir=[PRIMARYFOLDER];SourceDir=[SourceDir]" /> 


    <CustomAction 
    Id="CA_myCustomAction" 
    BinaryKey="myCustomActionsDLL" 
    DllEntry="CustomAction1" 
    Execute="deferred" Impersonate="no" 
    Return="check" /> 

    <InstallExecuteSequence> 
     <Custom Action="SetProperty" Before="InstallInitialize">Not Installed</Custom> 
     <Custom Action="CA_myCustomAction" Before="InstallFinalize">Not Installed</Custom> 
    </InstallExecuteSequence> 

    <!--<InstallUISequence> 
     <Custom Action="CA_myCustomAction" After="CostFinalize"></Custom> 
    </InstallUISequence>--> 

    </Module> 
</Wix> 

을, 나는 시도 - INSTALLLOCATION 여기서 installdir, TARGETDIR하지만 ProgramFiles (x86)에있는 응용 프로그램에 지정된 설치 폴더를 가져올 수 없습니다.

SourceDir의 값은 실행되는 동안 MSI 파일이있는 적절한 값으로 나옵니다.

답변

3

문제 해결은 항상 자세한 로그를 생성하고 읽는 것으로 시작해야합니다. 한 번에 여러 문제가있을 수 있으며 동시에 모두 해결해야합니다.

먼저 유형 51 세트 특성 사용자 정의 조치가 InstallInitialize 전에 스케줄됩니다. 이 속성은 보안 사용자 지정 속성이 아니므로 트랜잭션으로 전달되지 않습니다. 대신 InstallInitialize 후에 예약하십시오.

두 번째는 병합 모듈에 있고 모듈을 모듈화 (GUID 추가) 한 것입니다. 모든 식별자가 거의 같습니다. ORCA에서 빌드 병합 모듈을 보면 INSTALLDIR을 찾을 수 없다는 것을 알 수 있습니다. INSTALLDIR.GUID를 찾고 있습니다.

실제로 INSTALLDIR을 사용해야하는 경우 값없이 INSTALLDIR이라는 속성을 정의하고 SuppressModularization 특성을 사용하여 GUID를 방지하십시오. 내가 일반적으로 취하는 접근 방식은 MergeRedirectFolder 디렉토리를 정의하고이를 대신 사용하는 것입니다. 그런 다음 InstallShield에 병합 모듈을 추가 할 때 모듈을 INSTALLDIR에 연결하면 전이 속성이 적용됩니다.

다른 문제가있을 수 있지만 최종 MSI를보고 로그를 읽지 않고는보기가 어렵습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Module Id="MergeModule2" Language="1033" Version="1.0.0.0"> 
    <Package Id="c4acbfbc-a0e8-4d52-b516-bee471a76e8a" Manufacturer="" InstallerVersion="200" /> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="MergeRedirectFolder"/> 
    </Directory> 
    <Binary Id="myCustomActionsDLL" SourceFile="CustomAction1.CA.dll" /> 
    <CustomAction Id="SetProperty" Execute="immediate" 
        Property="CA_myCustomAction" 
        Value="InstallDir=[MergeRedirectFolder];SourceDir=[SourceDir]" /> 
    <CustomAction Id="CA_myCustomAction" 
     BinaryKey="myCustomActionsDLL" 
     DllEntry="CustomAction1" 
     Execute="deferred" Impersonate="no" 
     Return="check" /> 
    <InstallExecuteSequence> 
     <Custom Action="SetProperty" After="InstallInitialize">Not Installed</Custom> 
     <Custom Action="CA_myCustomAction" Before="InstallFinalize">Not Installed</Custom> 
    </InstallExecuteSequence> 

    </Module> 
</Wix> 
+0

감사합니다. 그것은 당신보다 다른 윅스를 아는 사람이 stackoverflow에없는 것 같습니다. MergeRedirectFolder 또는 SuppressModularization을 사용하기 위해 인터넷에 예제 또는 포인터를 제공해 주시겠습니까? – teenup

+0

MergeRedirectFolder를 사용하여 예제를 업데이트했습니다. 여기서 보여줄 수없는 부분은 InstallShield에 병합 모듈을 추가 할 때 마우스 오른쪽 버튼을 클릭하고 드롭 다운 목록을 사용하여 병합 모듈을 INSTALLDIR과 연결해야한다는 것입니다. –

+0

고마워, 나는 이것을 월요일에 시도 할 것이다. 고마워. – teenup