【问题标题】:Wix Custom Action Implementation for Writing Installfolder in text用于在文本中编写 Installfolder 的 Wix 自定义操作实现
【发布时间】:2014-12-04 13:07:07
【问题描述】:

我有以下 Wix 代码,它应该将属性值发送到用 C# 编写的自定义操作。基本上我想要的是在安装 MSI 时,我想在文本文件中写入 Wix 安装程序的文件夹的路径。我参考了this 站点并相应地创建了代码,但我的自定义操作不起作用。

以下是我的 Wix 文件:

<?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>

我还提供了应该获取值并将其写入文件的 C# 代码:

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;
        }
    }
}

Wix 文件编译并提供未获得 INSTALLEDPATH 值的 MSI。如果我在 CustomAction 标记中添加 DllEntry="InstallFolderFinder",则会失败并出现错误 CustomAction/@DllEntry 属性不能与此元素上先前指定的属性共存。 CustomAction 元素一次只能指定以下目标属性之一:DllEntry、Error、ExeCommand、JScriptCall、Script、Value 或 VBScriptCall

如何将 INSTALLEDPATH 的值传递给 C# 自定义操作?

【问题讨论】:

    标签: c# visual-studio-2010 wix windows-installer


    【解决方案1】:

    在浏览了更多网站后,我已经解决了这个问题。我已经在 gist 中添加了代码。 Wix 文件代码为 here,C# 自定义操作代码为 here。基本上我加了 InstallExuteSequeunce 中的两个自定义标记,首先加载 dllentry,第二个将参数传递给用 C# 编写的自定义操作。

    【讨论】:

    • 有趣——我喜欢这个解决方案,我没有想到使用另一个自定义操作来根据 UI 值设置值。不错。
    • 查看我的评论以获得我的答案。这是延迟自定义操作的一个很好的工作示例(如果有人需要延迟 CA)。
    【解决方案2】:

    MSI 正在确定操作CostInitializeCostFinalize 之间的路径。 很少推荐使用硬编码序列,可能你为此选择了错误的序列号。

    试试:

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

    希望您确定,INSTALLDEDPATH 是您的正确属性。路径的 MSI 基本属性是 `TARGETDIR。

    如果仍然不起作用,请尝试自定义操作类型 51,并在 [INSTALLEDPATH] 的值上设置属性 MYDUMMY。现在您可以看到,至少该值是否正确写入了未编程的标准自定义操作中。

    【讨论】:

    • Philm 感谢您的洞察力。经过一番谷歌搜索,我找到了解决方案。
    • 恭喜它现在可以工作了。仅供参考:您找到的解决方案是延迟自定义操作的解决方案(正如您在 WiX 代码中参数化的那样:Execute="deferred")。对于简单的读取属性,延迟的自定义操作不是很舒服(如您所见,首先您需要另一个自定义操作将必要的属性推入其中)。这就是我在你最后一个问题中提到的。对于简单地读出属性,立即自定义操作就足够了,但是您需要按我的回答中描述的顺序排列正确的位置。
    猜你喜欢
    • 2021-03-29
    • 2011-08-17
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多