Wixsharp 升级不保留以前的设置,如数据库数据和其他配置

Wixsharp upgrade is not retaining previous settings like DB data and other configurations

我正在使用 wixsharp 构建我的安装程序。每次我提供新版本时,我都想更新我所有的 exe、dll 和其他二进制文件,但我想保留手动更改的设置,就像我们可以选择将一些密钥存储在数据库中,这将在程序文件的应用程序文件夹内创建一些文件夹。我想保留这些数据并替换二进制文件,但是当我升级它时也会删除这些数据。

我正在使用下面的 wixsharp 代码来实现升级。

project.UpgradeCode= new Guid("some GUID here, keeping it same in all builds");
project.ProductId = new Guid("GUID here, changing it in all incremental build");
project.Version = new Version(6, 1, 1, 1); // upgrading it in incremental builds
            project.MajorUpgrade = new MajorUpgrade
            {
                Schedule = UpgradeSchedule.afterInstallValidate,
                AllowSameVersionUpgrades = true,
                MigrateFeatures =true,
                IgnoreRemoveFailure=true,
                DowngradeErrorMessage="A new version of this product is already installed."
            };

我面临的另一个问题是,当我们安装第二个版本时,它没有显示升级选项,而是仅显示安装选项(如全新安装),最后它要求用户允许卸载产品,这似乎是在卸载旧产品,但它看起来并不友好,因为用户可能会觉得为什么 he/she 正在卸载该产品。 我只想要一个升级选项,它可以在不向用户显示后端发生了什么的情况下进行升级。

问题一:

如果你想要一些静态文件,如果不存在则添加这些文件但不使用新的安装更新它们。您需要使用 Permanent="yes" NeverOverwrite="yes" 属性标记它们。

如需更多信息link,请点击此处:Wix Component Element

如何用 WixSharp 制作?

这是我的代码如何使 index.html 和 web.config 不可变:

        var immutableFiles = 
        {
            @"index.html",
            @"web.config"
        };
// ....
        var wixObjects = new WixObject[]
        {
            new Dir(
                @"%ProgramFiles%\YourProductFolderName\",
                WixFilesBuilderUtils.BuildDirectoryInfo(BinariesRoot, immutableFiles)),
            // Properties etc...
        }.ToArray();

        var project = new ManagedProject("name",  wixObjects);

建造者代码:

 public class WixFilesBuilderUtils
{
    public static WixEntity[] BuildDirectoryInfo(string currentRoot, IEnumerable<string> immutableFiles)
    {
        var result = new List<WixEntity>();
        var currentRootDictionaryInfo = new DirectoryInfo(currentRoot);
        var localImmutableFiles = immutableFiles.Select(fileName => fileName.ToLower()).ToArray();

        var currentRootDirList = currentRootDictionaryInfo
            .GetDirectories()
            .Select(dirInfoSub => dirInfoSub.FullName).ToArray();

        result.AddRange(
            Directory.GetFiles(currentRootDictionaryInfo.FullName)
                .Select(
                    filePath => new WixSharp.File(filePath)
                    {
                        Attributes = MarkFileAsPersonal(filePath, localImmutableFiles)
                    })
                .Cast<WixEntity>());

        if (currentRootDirList.Any())
        {
            var subDirs = currentRootDirList
                .Select(dirPath => new DirectoryInfo(dirPath))
                .Select(
                    rootSubDirInfo =>
                        new Dir(rootSubDirInfo.Name,
                            BuildDirectoryInfo(rootSubDirInfo.FullName, localImmutableFiles)))
                .Cast<WixEntity>();

            result.AddRange(subDirs);
        }

        return result.ToArray();
    }

    private static Dictionary<string, string> MarkFileAsPersonal(string path, IEnumerable<string> immutableFiles)
    {
        return immutableFiles.Any(path.ToLower().EndsWith)
                   ? new Dictionary<string, string>
                       {
                           { "Component:Permanent", "yes" },
                           { "Component:NeverOverwrite", "yes" }
                       }
                   : new Dictionary<string, string>();
    }
}

问题二:

请尝试在每个构建和这一策略中使用相同的 UpdateCode 和 ProductCode GUID:

MajorUpgradeStrategy = new MajorUpgradeStrategy
            {
                RemoveExistingProductAfter = Step.InstallInitialize,
                UpgradeVersions = VersionRange.OlderThanThis,
                PreventDowngradingVersions = VersionRange.NewerThanThis,
                NewerProductInstalledErrorMessage = "."
            };