WiX:将安装路径传递给托管自定义操作

Dan*_*iel 10 installer windows-installer wix wix3

新的一天,新的问题;-)仍然需要与托管自定义操作斗争.我已经设法调用自定义操作并将一些测试数据传递给它.现在我想用我需要的真实数据替换testdata.这里问题就出现了:我想调用一个安装在我的安装子目录中的批处理文件.因此,我需要将安装路径传递给自定义操作.Afaik这可以使用customactiondata mechnism完成.但这不起作用.当我记录安装时,我可以看到习惯用户INSTALLLOCATION之外指向正确的路径,但是当我查看惯例时,customactiondata属性为空...

任何人都可以查看我的代码并给我一个提示我做错了什么?谢谢你的优点!

调用自定义操作的合并模块:

<Module Id="DflHelpInstaller" Language="1033" Version="1.0.0.0">
    <Package Id="f952de58-1dc6-46b3-872a-7a49e2d9ea0a" Manufacturer="DflHelpInstaller" InstallerVersion="200" />

<Binary Id='RegisterDflHelpDll' SourceFile="$(var.REGISTERHELP.TargetDir)RegisterDflHelp.CA.dll" />

    <CustomAction Id='RegisterDflHelp' BinaryKey='RegisterDflHelpDll'  DllEntry='RegisterDflHelp' Execute='deferred' />

    <CustomAction Id="RegisterDflHelp.SetProperty" Return="check" Property="RegisterDflHelp" Value='[INSTALLLOCATION]' Execute='immediate' />


    <InstallExecuteSequence>
      <Custom Action='RegisterDflHelp.SetProperty' After='CostFinalize' />
      <Custom Action='RegisterDflHelp' After='InstallFiles' />
    </InstallExecuteSequence>

    <Directory Id="TARGETDIR" Name="SourceDir">
        </Directory>
    <ComponentGroupRef Id="HelpGroup"/>

    </Module>
</Wix>
Run Code Online (Sandbox Code Playgroud)

使用MergeModule的安装程序项目概述:

....

<Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="ProgramFilesFolder" SourceName="PFFiles">
<Directory Id="Company" Name='$(var.COMPANY)'>
  <Directory Id="INSTALLLOCATION" SourceName='$var.v[SDK_VERSION]'>
    <Component Id="MyBanner" Guid="C8C28B92-9326-4991-BFB1-BBDFDF3653AB">
      <File Id ="Banner.bmp" Source="Banner.bmp" KeyPath="yes" DiskId="1"/>
    </Component>
    <Merge Id ="DflHelpInstaller" SourceFile="DflHelpInstaller.msm" Language="1033" DiskId="1" />
      </Directory>
</Directory>
Run Code Online (Sandbox Code Playgroud)

....

    <Feature Id="Complete" Title="Setup" Description="Installs the SDK on your local machine." Display="expand" Level="1" ConfigurableDirectory="INSTALLLOCATION">
      <ComponentRef Id="Banner" />
      <ComponentRef Id ="UNINSTALLER"/>
      <ComponentGroupRef Id="ReferenceGroup"/>
      <MergeRef Id="DflHelpInstaller"/>
</Feature>
Run Code Online (Sandbox Code Playgroud)

CustomAction:

   public class CustomActions
   { 
        [CustomAction]
        public static ActionResult RegisterDflHelp(Session session)
        {
            session.Log("Begin CustomAction1");
            session.Log("Before Access to customactiondata");

            //should contain the installation path - unfortunatelly it is empty! why?
            string cad = session["CustomActionData"];
            Debugger.Break();


            RegisterHelp(cad);

            session.Log("End of custom action..");
            return ActionResult.Success;
        }
Run Code Online (Sandbox Code Playgroud)

Ric*_*der 18

如果您描绘的数据如...

<CustomAction Id="MyCustomActionData" Return="check" Property="MyCustomAction" Value='PROPERTY0=[PROPERTY0];PROPERTY1=[PROPERTY1];PROPERTY2=[PROPERTY2]' Execute='immediate' />
Run Code Online (Sandbox Code Playgroud)

您可以访问以下数据:

string property0 = session.CustomActionData["Property0"];
string property1 = session.CustomActionData["Property1"];
string property2 = session.CustomActionData["Property2"];
Run Code Online (Sandbox Code Playgroud)

在上一个示例中,您将使用:

<CustomAction Id="RegisterDflHelp.SetProperty" Return="check" Property="RegisterDflHelp" Value='INSTALLLOCATION=[INSTALLLOCATION]' Execute='immediate' />
Run Code Online (Sandbox Code Playgroud)

然后

string cad = session.CustomActionData["INSTALLLOCATION"];
Run Code Online (Sandbox Code Playgroud)


Ran*_*ger 6

我使用.WXS文件中的以下内容完成了此操作:

<Directory Id="TARGETDIR" Name="SourceDir">
 <Directory Id="ProgramFilesFolder" Name="PFiles">
  <Directory Id="ManufacturerDir" Name="Company" ShortName="Company">
   <Directory Id="INSTALLDIR" Name="TheApp">
    <Directory Id="BatchFileLocation" Name="BatchFiles">
     <Component Id="BatchFilesComp" ... >
      <File Id="SomeFile_BAT" Source="BatchFiles\SomeFile.bat" Name="SomeFile.bat" ... />
     </Component>
    </Directory>
   </Directory>
  </Directory>
 </Directory>
</Directory>
Run Code Online (Sandbox Code Playgroud)

并在自定义Action中:

var batchDirectory = session.GetTargetPath("BatchFileLocation");
var batchFile = batchDirectory + "SomeFile.bat"
Run Code Online (Sandbox Code Playgroud)

现在,我还没有想出如何避免重复文件名,但这确实成功返回批处理文件的安装位置.


Jul*_*bre 5

经过几个小时的努力,以下内容对我有用:

string UserDefinedInstallDir = session["INSTALLDIR"];
Run Code Online (Sandbox Code Playgroud)

希望它对其他人有帮助!


Jam*_*esD 1

您是否尝试过直接从托管 CA 中查询 INSTALLLOCATION 属性?

string cad = session["INSTALLLOCATION"];
Run Code Online (Sandbox Code Playgroud)

使用 DTF 的优点之一是您可以读/写访问所有 MSI 属性,而无需使用命令行等。因此,即使无法像普通属性一样查询 INSTALLLOCATION,您也可以定义自己的 MSI 属性,将其设置为INSTALLOCATION 的值并在您的 CA 内查询该值。

  • 如果这是一个“延迟”的序列,那就不是,这就是他正在做的事情。只有少数属性可按延迟顺序使用。 (3认同)