2014-12-04 1 views
0

속성 값을 C#으로 작성된 사용자 지정 작업에 보내야하는 다음 Wix 코드가 있습니다. 기본적으로 내가 원하는 것은 MSI가 설치되었을 때, Wix가 텍스트 파일에 프로그램을 설치 한 폴더의 경로를 쓰고 싶습니다. 나는 this 사이트를 참조하고 그에 따라 코드를 만들었지 만, 내 사용자 지정 작업이 작동하지 않습니다.텍스트에 Installfolder를 쓰는 Wix 사용자 지정 액션 구현

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Deployment.WindowsInstaller; 

namespace SetupCAInstallFolder 
{ 
    public class CustomActions 
    { 
     [CustomAction] 
     public static ActionResult InstallFolderFinder(Session session) 
     { 
      session.Log("Here is the SetupCAInstallFolder"); 
      string path = session["INSTALLEDPATH"]; 
      session.Log("Installed Path is " + path); 
      System.IO.File.WriteAllText("F:\\pathgenerated.txt", path); 
      //System.IO.File.WriteAllText(path + "installed.txt", "sdkasdkasdlkasdk"); 

      return ActionResult.Success; 
     } 
    } 
} 

윅스 파일을 컴파일하고 있습니다 : 나는 또한 가치를 얻을 및 파일에 쓰기로되어 내 C# 코드를 준

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product Id="*" Name="SetupInstallFolder" Language="1033" Version="1.0.0.0" Manufacturer="LP" UpgradeCode="9e10a7d8-4ffb-493c-8318-c44ba4bc0c4c"> 
     <Package InstallerVersion="200" Compressed="no" InstallScope="perMachine" /> 

     <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 
     <MediaTemplate /> 

     <Feature Id="ProductFeature" Title="SetupInstallFolder" Level="1"> 
      <ComponentGroupRef Id="ProductComponents" /> 
     </Feature> 
    </Product> 

    <Fragment> 
     <Directory Id="TARGETDIR" Name="SourceDir"> 
      <Directory Id="ProgramFilesFolder"> 
       <Directory Id="INSTALLFOLDER" Name="SetupInstallFolder" /> 
      </Directory> 
     </Directory> 
    </Fragment> 

    <Fragment> 
     <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> 
     <Component Id="SomeRandomEXE"> 
     <File Source ="G:\SarVaGYa\myworkspace\LatestLpa\lpa\lpa_c\here\src\lpa\Release\lpa.exe" /> 
     </Component>  
     </ComponentGroup> 
    <Binary Id="SetupCA2" src="G:\visual studio stuffs\SetupCAInstallFolder\SetupCAInstallFolder\bin\Release\SetupCAInstallFolder.CA.dll"/> 
    <CustomAction Id="INSTALLFOLDERFINDER" Execute="immediate" Property="INSTALLEDPATH" Value="[INSTALLFOLDER]" /> 
    <InstallExecuteSequence> 
     <Custom Action="INSTALLFOLDERFINDER" Sequence="2"></Custom> 

    </InstallExecuteSequence> 
    </Fragment> 
</Wix> 

: 다음

내 윅스 파일입니다 INSTALLEDPATH 값을 얻지 못하는 MSI. DllEntry = "InstallFolderFinder"CustomAction 태그에을 추가하면 오류로 인해 실패합니다. CustomAction/@ DllEntry 특성은이 요소에서 이전에 지정한 특성과 공존 할 수 없습니다. DllEntry, 오류, ExeCommand, JScriptCall, 스크립트, 가치, 또는 VBScriptCall

가 어떻게 C# 사용자 지정 작업에 참고 InstalledPath의 값을 전달 수행하십시오에서 CustomAction 요소는 한 번에 지정된 다음 대상 속성 중 하나를 가질 수있다?

답변

3

더 많은 사이트가 걸려 넘어지면서 문제가 해결되었습니다. 요점에 코드를 추가했습니다. 윅스 파일 코드 here하고 C#을 사용자 지정 작업 코드는 here입니다. 기본적으로 나는두 개의 사용자 정의 태그를 InstallExexuteSequeunce에 먼저 추가하여 dllentry를로드하고 두 번째 사용자 정의 매개 변수는 C#으로 작성된 사용자 정의 액션에 매개 변수를 전달합니다.

+0

흥미 롭 군 -이 솔루션이 마음에 들었고 다른 사용자 지정 동작을 사용하여 UI 값을 기반으로 값을 설정하지는 않았습니다. 좋은. – Joe

+0

내 대답에 대한 내 의견보기.이것은 연기 된 사용자 지정 작업 (다른 사용자가 지연된 CA를 필요로하는 경우)에 대한 좋은 예입니다. – Philm

1

MSI는 작업 CostInitializeCostFinalize 사이의 경로를 확인 중입니다. 하드 코딩 된 시퀀스를 사용하는 것은 거의 권장 할만한 것이 아니며 잘못된 시퀀스 번호를 선택했을 수도 있습니다.

시도 :

<InstallExecuteSequence> 
    <Custom Action='INSTALLFOLDERFINDER' After='CostFinalize'></Custom> 
</InstallExecuteSequence> 

나는 INSTALLDEDPATH 당신의 올바른 속성입니다, 당신은 확인 바랍니다. 경로의 MSI 기본 속성은`TARGETDIR입니다.

그래도 작동하지 않으면값에 MYDUMMY 속성을 설정하여 사용자 지정 작업 유형 51을 시도하십시오. 이제 프로그래밍되지 않은 표준 사용자 정의 동작에 값이 올바르게 기록되어 있는지 확인할 수 있습니다.

+0

귀하의 통찰력에 감사드립니다. 주위에 몇 가지 인터넷 검색 후, 나는 해결책을 찾았습니다. – Pant

+0

그것이 지금 작동합니다. FYI : 찾은 해결책은 지연된 사용자 지정 작업 (WiX 코드에서 매개 변수화 한 것처럼 Execute = "deferred")에 대한 솔루션입니다. 단순히 속성을 읽는 데 지연된 사용자 지정 동작은별로 편하지 않습니다 (처음에는 필요한 속성을 밀어 넣기 위해 다른 사용자 지정 동작이 필요합니다). 그 질문은 곧 귀하의 마지막 질문에서 언급 한 것입니다. 단순히 속성을 읽는 것만으로도 즉각적인 사용자 지정 작업을 수행하기에 충분하지만 내 대답에 설명 된 순서대로 올바른 위치가 필요합니다. – Philm

관련 문제