我正在尝试为我的 Windows 项目创建一个 MSI 安装程序/卸载程序,包括一个服务、几个用户模式 exes/dll 和一些数据文件。我能够使用 Visual Studio 2010 编译一个 MSI 包,使用它的Setup Project
. 它适用于安装,但卸载需要一些额外的步骤才能实际删除文件以及注册表设置。
所以我想知道,有什么方法可以在删除文件/注册表设置之前运行脚本(C# 或 WSH JScript)?
我正在尝试为我的 Windows 项目创建一个 MSI 安装程序/卸载程序,包括一个服务、几个用户模式 exes/dll 和一些数据文件。我能够使用 Visual Studio 2010 编译一个 MSI 包,使用它的Setup Project
. 它适用于安装,但卸载需要一些额外的步骤才能实际删除文件以及注册表设置。
所以我想知道,有什么方法可以在删除文件/注册表设置之前运行脚本(C# 或 WSH JScript)?
是的,您还可以将脚本(VBS 或 JScript)添加到 MSI 作为已编译的启用 MSI 的 Dll 中的 C# 或 C++ 自定义操作,您可以调用 .exe 文件等。有一个名为 CustomAction 的表,自定义操作可以排序对于序列表,最重要的是 InstallExecuteSequence 和 InstallUISequence。
我认为使用自定义操作并不是一件容易的事。如果可以请教专家,我会考虑。
大多数情况下,当您想要添加自定义操作来卸载资源时,您的 MSI 可能有问题。想要添加的 5 个自定义操作中的 4 个不是必需的,但可以用正确的 MSI 表条目替换。
一般来说,我不建议使用 Visual Studio 安装程序,因为它给你的控制权不是很大,而且很容易出错,尤其是升级和更复杂的任务。
但是如果你仍然想添加一个自定义动作,这里有一些基本的想法:例如,为了启动一个 VB 脚本,你可以添加一个类型为 38 的自定义动作。在“动作”列中选择一个名称,让“源”列为空,然后在“目标”列中键入 VB 脚本代码:例如,您有一个 VB“接口”到 MSI 属性,例如这里新发明的“MYDIR_EXISTS”。
on Error Resume Next
set filobj = Createobject( "Scripting.FileSystemObject" )
If filobj.FolderExists("C:\MyDir") Then Session.Property("MYDIR_EXISTS") = "True"
...
如果您使用 Visual Studio 安装程序,您可以考虑在之后添加自定义操作和转换。这同样需要一些 MSI 知识。
就我个人而言,我不会使用分布式设置的脚本文件,除非该设置是同一家公司的基础设施。但这是一个起点。调用具有自定义操作类型 34 或 50 的已编译 .exe 将是一种替代方法。