Windows installer 在MSI安装程序中动态包含文件

Windows installer 在MSI安装程序中动态包含文件,windows-installer,installation,Windows Installer,Installation,我试图在我的MSI设置中的一个目录中部署一堆文件。由于文件会频繁更改,我不想直接添加文件,而是想自动将目录中的所有文件包括在内,并将它们部署到特定位置 我正在使用Visual Studio安装项目 有人知道如何/如果这是可能的吗?使用什么 女巫?安装盾?Visual Studio?明智?你知道吗?微星工厂?其他Windows安装工具 InstallShield-是的。将“动态文件夹”添加到设置中 WiX-有点像。在调用蜡烛/灯光之前,使用加热生成(部分)WiX源 在NSIS中,我用Perl生成

我试图在我的MSI设置中的一个目录中部署一堆文件。由于文件会频繁更改,我不想直接添加文件,而是想自动将目录中的所有文件包括在内,并将它们部署到特定位置

我正在使用Visual Studio安装项目

有人知道如何/如果这是可能的吗?

使用什么

女巫?安装盾?Visual Studio?明智?你知道吗?微星工厂?其他Windows安装工具

  • InstallShield-是的。将“动态文件夹”添加到设置中
  • WiX-有点像。在调用蜡烛/灯光之前,使用
    加热
    生成(部分)WiX源

在NSIS中,我用Perl生成了一部分NSIS脚本,并拥有一个包含动态脚本的主脚本


简短回答:这绝对是可能的。

我通过一种变通方法解决了这个问题:

  • 添加一个构建操作,将整个目录(可以过滤)打包到ZIP文件
  • 将对空ZIP文件的引用添加到部署项目中
  • 向部署项目添加自定义操作以将ZIP解压缩到目标文件夹

它简单而稳定。

选择文件夹路径并传递给此方法。它将按照文件夹层次结构存在的顺序创建msi文件

公共类InstallData { public void GetWixData(字符串源路径) { 尝试 { WixEntity[]weDir=新WixEntity[0]; weDir=BuildDirInfo(SourcePath,weDir)


}

如何压缩和解压它?是否有命令或需要发布zip应用程序?我参与的项目已经在适当的许可证下引用了ICSharpZipLib,因此C#自定义操作在我的情况下非常方便。在卸载应用程序时它是否也卸载这些项目?当然,在卸载整个INST的过程中已删除包含已部署文件的ALLDIR目录。这是由其他无关的自定义操作完成的。没有什么特别的,因为其他文件(如日志文件)也应删除。VS卸载程序仅删除其自身部署的文件,仅此而已。
            var project = new Project("My Product", new Dir("MyDB", weDir), new ManagedAction("MyAction"))
            {
                GUID = Guid.NewGuid(),
                UI = WUI.WixUI_InstallDir,
                Manufacturer = "xxx Inc.",

            };



            try
            {



                Compiler.BuildMsi(project, Application.StartupPath);
            }

            catch (Exception ex)
            {
            }

        }

        catch (Exception Ex)
        {

        }
    }


    private WixEntity[] BuildDirInfo(string sRootDir, WixEntity[] weDir)
    {
        DirectoryInfo RootDirInfo = new DirectoryInfo(sRootDir);
        if (RootDirInfo.Exists)
        {
            DirectoryInfo[] DirInfo = RootDirInfo.GetDirectories();
            List<string> lMainDirs = new List<string>();
            foreach (DirectoryInfo DirInfoSub in DirInfo)
                lMainDirs.Add(DirInfoSub.FullName);
            int cnt = lMainDirs.Count;
            weDir = new WixEntity[cnt + 1];
            if (cnt == 0)
                weDir[0] = new DirFiles(RootDirInfo.FullName + @"\*.*");
            else
            {
                weDir[cnt] = new DirFiles(RootDirInfo.FullName + @"\*.*");
                for (int i = 0; i < cnt; i++)
                {
                    DirectoryInfo RootSubDirInfo = new DirectoryInfo(lMainDirs[i]);
                    if (!RootSubDirInfo.Exists)
                        continue;
                    WixEntity[] weSubDir = new WixEntity[0];
                    weSubDir = BuildDirInfo(RootSubDirInfo.FullName, weSubDir);
                    weDir[i] = new Dir(RootSubDirInfo.Name, weSubDir);
                }
            }
        }


        return weDir;
    }
}
       return ActionResult.Success;
   }