Windows installer 在MSI安装程序中动态包含文件
我试图在我的MSI设置中的一个目录中部署一堆文件。由于文件会频繁更改,我不想直接添加文件,而是想自动将目录中的所有文件包括在内,并将它们部署到特定位置 我正在使用Visual Studio安装项目 有人知道如何/如果这是可能的吗?使用什么 女巫?安装盾?Visual Studio?明智?你知道吗?微星工厂?其他Windows安装工具Windows installer 在MSI安装程序中动态包含文件,windows-installer,installation,Windows Installer,Installation,我试图在我的MSI设置中的一个目录中部署一堆文件。由于文件会频繁更改,我不想直接添加文件,而是想自动将目录中的所有文件包括在内,并将它们部署到特定位置 我正在使用Visual Studio安装项目 有人知道如何/如果这是可能的吗?使用什么 女巫?安装盾?Visual Studio?明智?你知道吗?微星工厂?其他Windows安装工具 InstallShield-是的。将“动态文件夹”添加到设置中 WiX-有点像。在调用蜡烛/灯光之前,使用加热生成(部分)WiX源 在NSIS中,我用Perl生成
- InstallShield-是的。将“动态文件夹”添加到设置中
- WiX-有点像。在调用蜡烛/灯光之前,使用
生成(部分)WiX源加热
简短回答:这绝对是可能的。我通过一种变通方法解决了这个问题:
- 添加一个构建操作,将整个目录(可以过滤)打包到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;
}