用于在文本中编写Installfolder的Wix自定义操作实现

时间:2014-12-04 13:07:08

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

我有以下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文件编译并为MSI提供 INSTALLEDPATH 的值。如果我在CustomAction标记中添加 DllEntry =&#34; InstallFolderFinder&#34; ,则会失败并显示错误 CustomAction / @ DllEntry属性无法与此元素上先前指定的属性共存。 CustomAction元素可能只有一次指定的以下目标属性之一:DllEntry,Error,ExeCommand,JScriptCall,Script,Value或VBScriptCall

如何将INSTALLEDPATH的值传递给C#Custom Action?

2 个答案:

答案 0 :(得分:3)

我在找到更多网站后修复了这个问题。我在gist中添加了代码。 Wix文件代码为 here ,C#自定义操作代码为 here 。基本上我补充说 InstallExexuteSequeunce中的两个自定义标记,首先加载dllentry,第二个将参数传递给C#中的自定义操作。

答案 1 :(得分:1)

MSI正在确定行动CostInitializeCostFinalize之间的路径。 很难推荐使用硬编码序列,也许您为此选择了错误的序列号。

尝试:

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

我希望您确定,INSTALLDEDPATH是您正确的财产。路径的MSI基本属性是“TARGETDIR。”

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