c# - 使用 Wix# 构建 MSI 的递归 DirFiles

标签 c# wix windows-installer wixsharp

我正在探索 Wix# 的功能,与 Wix 相比,我对它的简单性感到震惊。我们已经在使用 QT 安装程序框架,但我们的客户也需要 MSI 安装包。

我已经有一个包含我们产品的所有文件的目录,并且只有一个包。我试图在 C:\Temp\MyProductFiles 中包含所有文件进入我的 MSI 安装程序。

using System;
using WixSharp;

class Script
{
    static public void Main(string[] args)
    {
        Compiler.WixLocation= @"C:\WiX-3.7\binaries"; 
        var project = new Project("MyProduct",
                          new Dir(@"C:\Temp\MyProduct", 
                            new DirFiles(@"C:\Temp\MyProductFiles\*.*")
                           )
                      );
        project.UI = WUI.WixUI_Common;

        Compiler.BuildMsi(project);
    }
}

安装程序基本上按预期工作,但不幸的是 C:\Temp\MyProductFiles包含许多子目录,我不想每次都明确说明,因为我们有几个产品。

有没有一种简单的方法可以使用 Wix# 自动包含所有文件和子目录?

也许使用 C# 也可以做到,但我不精通 C#,我真的不知道如何开始。

最佳答案

据我所知,没有内置的机制来获取所有子目录,但您可以递归遍历树,并将每个条目投影到 DirFiles 中。

IEnumerable<string> GetSubdirectories(string root)
{
    string[] subdirectories = Directory.GetDirectories(root);
    foreach (var subdirectory in subdirectories)
    {
        yield return subdirectory;
        foreach (var nestedDirectory in GetSubdirectories(subdirectory))
        {
            yield return nestedDirectory;
        }
    }
}

投影可以输出成DirFiles的数组使用强制通配符模式:
DirFiles[] dirFiles = GetSubdirectories(rootPath).Select(d => new DirFiles(Path.Combine(d, "*.*"))).ToArray();

然后,这只是传递它的问题:
var project = new Project("MyProduct", new Dir(@"C:\Temp\MyProduct", dirFiles)));

关于c# - 使用 Wix# 构建 MSI 的递归 DirFiles,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57555120/

相关文章:

c# - 序列不包含元素

c# - (扩展图标栏 - chrome 浏览器)我们可以通过 selenium web 驱动程序自动执行此开/关操作吗

c# - 使用 XDocument 更改 XML 的顺序

wix - .msi文件可以自行安装(大概通过“自定义操作”)吗?

尽管设置了代码页,但具有数据库代码页中不可用字符的 Wix 字符串

WiX 构建警告 : The Media table has no entries

c# - 修复 MSI 卸载失败导致错误 2908 和 "UNKNOWN\Components"oprhaned 注册表项的答案

c# - SQL Server 中串联的最佳实践?

delphi - 如何使用delphi判断Windows安装程序是否繁忙?

c# - WiX - 如何使用配置文件来决定运行哪个 MSI?