传递 .msi 参数以安装自定义操作

Pass .msi Args to Install Custom Action

我在 Visual Studio 2013 年有一个安装和部署项目,它为我的解决方案创建了一个 .msi 安装程序。我还有一个在安装自定义操作中启动的 C# WinForms 应用程序。如果用户从命令行启动 .msi,是否有任何方法可以将命令行参数传递给在安装自定义操作期间运行的应用程序?

我知道我可以使用 CustomActionData 参数提供安装自定义操作应用程序参数,那么我能否以某种方式将其动态设置为任何 .msi 参数?还是有 easier/better 方法来做到这一点?

如有任何帮助,我们将不胜感激。

您可以将安装程序 class 添加到您的应用并覆盖 Install 方法。然后就可以在Context.Parameters属性.

中访问命令行参数了
[RunInstaller(true)]
public class CustomInstaller : System.Configuration.Install.Installer
{
    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);
        //this.Context.Parameters contains the command line arguments
    }
}

可以在 documentation 中找到更多信息。

这取决于您所说的 "command line arguments" 是什么意思,但我假设您指的是 属性 值,例如:

msiexec /I [你的 msi 路径] MYPROP1=THIS MYPROP2=THAT

并且您想将 MYPROP1 和 MYPROP2 值传递到自定义操作中。

所以只需将您的可执行文件添加为自定义操作即可。在自定义操作的属性 window 中有一个参数设置。如果你给它一个值:

[我的道具 1];[我的道具 2]

这些将在安装时解析为实际值并传递到您的命令行中。使用您的命令行希望看到的格式,例如:

/one=[MYPROP1] /two=[MYPROP2] 等等。

作为 Everyone 安装的自定义操作,运行 应用并不总是有用,主要是因为它们将 运行 使用本地系统帐户,因此无法访问安装用户的文件夹,一些数据库,网络等等。如果您正在配置某些东西,通常最好在您的应用首次 运行 时 运行 它,因此它会在正常的交互式用户上下文中 运行 。