Wix 自定义操作实现,用于在文本中写入安装文件夹

本文关键字:安装 文件夹 文本 操作 自定义 实现 用于 Wix | 更新日期: 2023-09-27 18:33:10

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

以下是我的 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文件编译并给出MSI没有得到INSTALLEDPATH的值。如果我在自定义操作标签中添加 DllEntry="安装文件夹查找器">,它会失败并显示错误 自定义操作/@DllEntry 属性不能与此元素上以前指定的属性共存。 元素一次只能指定以下目标属性之一:DllEntry、Error、ExeCommand、JScriptCall、Script、Value 或 VBScriptCall

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

Wix 自定义操作实现,用于在文本中写入安装文件夹

在偶然

发现更多网站后,我已经解决了这个问题。我已经在要点中添加了代码。Wix 文件代码在这里,C# 自定义操作代码在这里。基本上我添加了InstallExexuteSequeunce 中的两个自定义标记,首先加载 dllentry,然后将参数传递给用 C# 编写的自定义操作。

MSI 正在确定操作CostInitializeCostFinalize之间的路径。很少建议使用硬编码序列,也许您为此选择了错误的序列号。

尝试:

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

我希望你确定,INSTALLDEDPATH你是正确的财产。路径的 MSI 基属性是"TARGETDIR"。

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

相关文章: