2010-01-28 61 views
2

我想在我的MSI安装目录中部署一堆文件。由于文件会经常更改,我不想直接添加文件,而是想自动包含目录中的所有文件并将其部署到特定位置。在MSI安装中动态地包含文件

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

任何人都知道/如果这是可能的?

回答

1

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

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

它简单而稳定。

+0

你怎么压缩和解压缩呢?有没有命令,或者你需要发送一个zip应用程序? – 2010-04-08 04:59:27

+0

我工作的项目已经在适当的许可证下引用了ICSharpZipLib,所以C#自定义操作在我的情况下非常方便。 – user308623 2010-04-12 07:39:42

+0

它是否也在卸载应用程序时卸载这些项目? – 2010-05-10 22:48:15

0

使用什么?

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

  • InstallShield - yes。为您的设置添加一个“动态文件夹”。
  • WiX - 种。使用heat在调用蜡烛/灯光之前生成(部分)WiX源。
0

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

简答:这绝对有可能。

0

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

公共类InstallData { 公共无效GetWixData(串SOURCEPATH) { 尝试 { WixEntity [] weDir =新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] 公共静态的ActionResult MyAction(会话的会话) { MessageBox.Show( “世界,你好!”, “嵌入式管理CA”); session.Log(“Begin MyAction Hello World”);

 return ActionResult.Success; 
    } 

}