0

我有一个用WiX创建的MSI文件,它安装了我的可执行文件并复制了一个配置文件,该文件放置在 MSI 文件附近。我可以在安装前更改配置文件,更改后的版本将复制到安装文件夹。

<Component Id="ProductComponent" 
           Guid="714DCBE1-F792-401E-9DDC-67BC1853BE14">
    ....
    <File Source="Chiffa.exe.config" 
          Compressed='no'/>
</Component>

这就是我想要的,我很高兴,但并不满意,因为我需要安装一些其他软件包以及这个 MSI 文件。所以我用 WiX 创建了一个捆绑项目,并将我所有可爱的 MSI 包放到它的链中:

<Chain>
    .....
    <MsiPackage Compressed="yes"
                SourceFile="$(var.ChiffaSetup.TargetPath)"
                Vital="yes"
                Visible="no">
        <Payload SourceFile="Chiffa.exe.config"
                 Compressed="no"/>
    </MsiPackage>
</Chain>

除了一件小事,一切都很好。我无法更改配置文件,因为 bundle 检查了 MSI 包的一致性,并因“哈希码”而失败。

4

2 回答 2

0

“哈希码”是一个非常重要的功能,因为它可以检测到不完整或损坏的下载。如果您需要对配置文件进行任意更改,那么您只需为每次更改重新构建包。

但是,如果您可以为更改定义算法,那么您可以更改配置文件,因为它与XmlConfig安装项目中的元素一起安装,或者使用您自己的自定义操作。更改的数据可以完全在算法中定义或通过各种机制传递:通过 UI 或命令行参数设置的 Windows Installer 属性。如果通过命令行参数设置,它们可以从包中传递,这可以从自定义 BootstrapperApplication UI 或其命令行获取它们。

于 2013-07-05T02:49:51.440 回答
0

我认为解决方案是从 MSI 包中排除配置文件并使用自定义操作来复制文件(或者如果不存在则创建默认文件)。而且,当然,如果需要,该操作可以对文件进行任何检查。

但是你必须在卸载过程中添加代码来管理配置文件等等。这是另一个自定义操作。

像这样的东西:

[CustomAction]
public static ActionResult CopyBootstraperConfig(Session session)
{
    try
    {
        const string configFile = "Chiffa.exe.config";

        var customConfig = Path.Combine(Path.GetDirectoryName(session["OriginalDatabase"]), configFile);
        var targetConfig = Path.Combine(session.GetTargetPath("INSTALLLOCATION"), configFile);
        if (File.Exists(customConfig))
            File.Copy(customConfig, targetConfig);
        try
        {
           //do file checks
        }
        catch (Exception e)
        {
            File.Delete(targetConfig);
            throw;
        }
    }
    catch (Exception e)
    {
        return ActionResult.Failure;
    }
    return ActionResult.Success;
}
于 2013-07-05T10:14:22.587 回答