动态包含MSI设置中的文件

时间:2010-01-28 02:57:37

标签: windows-installer installation

我正在尝试在MSI设置的目录中部署一堆文件。由于文件会经常更改,我不想直接添加文件,而是有办法自动包含目录中的所有文件并将它们部署到某个位置。

我正在使用Visual Studio安装项目。

有人知道这是怎么回事?

4 个答案:

答案 0 :(得分:1)

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

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

它简单而稳定。

答案 1 :(得分:0)

使用什么????

维克斯?的InstallShield?视觉工作室?明智的?的InstallAware?微星工厂?其他一些Windows Installer工具?

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

答案 2 :(得分:0)

我在NSIS中通过在Perl中生成部分NSIS脚本并使用包含动态脚本的主脚本来完成此操作。

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

答案 3 :(得分:0)

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

公共类InstallData     {         public void GetWixData(string SourcePath)         {          尝试             {                 WixEntity [] weDir = new WixEntity [0];                 weDir = BuildDirInfo(SourcePath,weDir);

            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;
    }
}

公共类CustomActions    {        [CustomAction]        public static ActionResult MyAction(Session session)        {            MessageBox.Show(“Hello World!”,“Embedded Managed CA”);            session.Log(“开始MyAction Hello World”);

       return ActionResult.Success;
   }

}