Wix 自定义操作 - 从 XML 文件读取参数 [英] Wix Custom Actions - Reading Parameters from an XML file

查看:30
本文介绍了Wix 自定义操作 - 从 XML 文件读取参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何编写从 XML 文件导入参数值以在安装过程中使用的 Wix 安装程序?

How do I write a Wix installer which imports Parameter values from an XML file for use during the installation?

推荐答案

这不是一个完美的解决方案,但我花了两天时间让它工作并想分享.毫无疑问会有一些错误,但我已经在可用的时间内尽可能地做好了:

This isn't a perfect solution but I've spent two days getting it to work and wanted to share. No doubt there will be some errors, but I have done as good as I can in the time available:

  1. 添加一个新项目并选择一个 Windows Installer Xml 安装项目
  2. 添加一个新项目并选择一个 Windows Installer Xml C# 自定义操作项目
  3. 在您的设置项目中:

  1. Add a New Project and select a Windows Installer Xml Setup Project
  2. Add a New Project and select a Windows Installer Xml C# Custom Actions Project
  3. In your setup project:

  • 添加要安装的东西,例如文件\网站等(请参阅有关如何执行此操作的其他教程)
  • 在 Product.wxs 中设置一些属性,例如

  • Add something to be installed e.g. files \ web site etc. (See other tutorials on how to do this)
  • Set some properties in your Product.wxs e.g.

<Property Id="MyProperty1" />
<Property Id="MyProperty2" />

  • 在您的 Product.wxs 中引用您新创建的自定义操作(如下):

  • Reference your newly created Custom Actions (below) in your Product.wxs:

    <Product> .....
        <Binary Id='VantageInstallerCustomActions.CA.dll' src='..\VantageInstallerCustomActions\bin\$(var.Configuration)\VantageInstallerCustomActions.CA.dll' />
        <InstallExecuteSequence>
            <Custom Action="SetInstallerProperties" Before="CostFinalize"  />
        </InstallExecuteSequence>
    </Product>
    
    <Fragment>
        <CustomAction Id='SetInstallerProperties' BinaryKey='VantageInstallerCustomActions.CA.dll' DllEntry='SetInstallerProperties' Return='check' Execute='immediate' />
    </Fragment>
    

  • 将以下代码添加到您的自定义操作项目或类似内容中:

    Add the following code into your Custom Actions Project or something similar:

    添加一个 CustomAction 类:

    Add a CustomAction class:

        public class CustomActions
        {
         private static readonly InstallerPropertiesFileManager InstallerPropertiesFileManager = new InstallerPropertiesFileManager();
    
        [CustomAction]
        public static ActionResult SetInstallerProperties(Session session)
        {
            session.Log("Begin SetInstallerProperties");
    
            try
            {
    
                var doc = XDocument.Load(@"C:\temp\Parameters.xml");
    
                session.Log("Parameters Loaded:" + (doc.Root != null));
                session.Log("Parameter Count:" + doc.Descendants("Parameter").Count());
                var parameters = doc.Descendants("Parameter").ToDictionary(n => n.Attribute("Name").Value, v => v.Attribute("Value").Value);
    
                if (parameters.Any())
                {
                    session.Log("Parameters loaded into Dictionary Count: " + parameters.Count());
    
                    //Set the Wix Properties in the Session object from the XML file
                    foreach (var parameter in parameters)
                    {
                        session[parameter.Key] = parameter.Value;
                    }
                }                
                else
                {
                    session.Log("No Parameters loaded");
                }
            }
            catch (Exception ex)
            {
                session.Log("ERROR in custom action SetInstallerProperties {0}", ex.ToString());
                return ActionResult.Failure;
            }
            session.Log("End SetInstallerProperties");
            return ActionResult.Success;
        }
        }
    

    创建您的 C:\temp\Parameters.xml 文件以存储在磁盘上

    Create your C:\temp\Parameters.xml file to store on disk

        <?xml version="1.0" encoding="utf-8"?>
        <Parameters>
            <Environment ComputerName="Mycomputer" Description="Installation Parameters for Mycomputer" />
            <Category Name="WebServices">
                <Parameter Name="MyProperty1" Value="http://myserver/webservice" />
                <Parameter Name="MyProperty2" Value="myconfigSetting" />
            </Category>
        </Parameters>
    

    注意您不需要从设置项目中引用自定义操作项目.您也不应该在安装周期太晚设置早期需要的属性,例如安装文件的文件路径.我倾向于避免这些.

    N.B. you do not need to reference the Custom Actions Project from the Setup Project. You also shouldn't set properties too late in the installation cycle that are required early on for example those that are File Paths to install files. I tend to avoid these.

    在 Product.wxs 中使用您的属性来做一些事情!例如我正在使用检索到的属性来更新已安装的 web.config 中的 Web 服务端点

    Use your properties in your Product.wxs to do something! e.g. I am using the retrieved property to update a web service end point in the installed web.config

    <Fragment>
        <DirectoryRef Id ="INSTALLFOLDER">
          <Component Id="WebConfig" Guid="36768416-7661-4805-8D8D-E7329F4F3AB7">
            <CreateFolder />
            <util:XmlFile Id="WebServiceEnpointUrl" Action="setValue" ElementPath="//configuration/system.serviceModel/client/endpoint[\[]@contract='UserService.V1_0.GetUser.ClientProxy.Raw.IGetUserService'[\]]/@address" Value="[MyProperty1]" File="[INSTALLFOLDER]web.config" SelectionLanguage="XPath" />
          </Component>
        </DirectoryRef>
      </Fragment>
    

    与 Wix 安装程序一样,第一次没有任何效果.重新构建您的 Wix SetupProject 并使用以下命令行在本地运行 msi 以打开日志记录:

    As always with Wix installers, nothing works first time. Re-Build your Wix SetupProject and run the msi locally with the following command line to turn logging on:

    msiexec /i "myInstaller.msi" /l*v "log.log"
    

    运行后,打开日志文件,您应该会看到以下事件:

    Once run, open up the log file and you should see the following events:

    MSI (s) (C4:3C) [11:00:11:655]: Doing action: SetInstallerProperties
    Action start 11:00:11: SetInstallerProperties.
    MSI (s) (C4:A8) [11:00:11:702]: Invoking remote custom action. DLL: C:\WINDOWS\Installer\MSICD83.tmp, Entrypoint: SetInstallerProperties
    MSI (s) (C4:A8) [11:00:11:702]: Generating random cookie.
    MSI (s) (C4:A8) [11:00:11:702]: Created Custom Action Server with PID 496 (0x1F0).
    MSI (s) (C4:CC) [11:00:11:733]: Running as a service.
    MSI (s) (C4:CC) [11:00:11:733]: Hello, I'm your 32bit Impersonated custom action server.
    SFXCA: Extracting custom action to temporary directory: C:\Users\ak9763\AppData\Local\Temp\MSICD83.tmp-\
    SFXCA: Binding to CLR version v4.0.30319
    Calling custom action VantageInstallerCustomActions!VantageInstallerCustomActions.CustomActions.SetInstallerProperties
    Begin SetInstallerProperties
    Parameters loaded into Dictionary: 2
    MSI (s) (C4!C0) [11:00:11:858]: PROPERTY CHANGE: Adding MyProperty1 property. Its value is 'http://myserver/webservice'.
    MSI (s) (C4!C0) [11:00:11:858]: PROPERTY CHANGE: Adding MyProperty2 property. Its value is 'myConfigSetting'.
    End SetInstallerProperties
    Action ended 11:00:11: SetInstallerProperties. Return value 1.
    

    这篇文章的参考:

    在 C# 中创建 WiX 自定义操作并传递参数

    从 MSI 到 WiX,第 5 部分 - 自定义操作:简介

    创建 MSI 日志文件

    这篇关于Wix 自定义操作 - 从 XML 文件读取参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆