C# 禁用Wix自定义操作打开/关闭/关闭

C# 禁用Wix自定义操作打开/关闭/关闭,c#,custom-action,wix3.5,C#,Custom Action,Wix3.5,在WIX自定义操作中,是否有方法检测MSI是否使用/silent或/quiet命令行开关调用?基本上,我想要的是不执行自定义操作(因为它显示一个表单),或者在传递这些命令行开关时以不同的方式处理它,但我无法找到这一点 是否有可能检测到它?您可以检查属性并根据您的条件执行CA。您可以检查属性并根据您的条件执行CA。我终于找到了答案。Wix基本上总是将UILevel属性设置为2.0。它有自己的财产称为WixBundleUILevel。现在重要的是,在Wix 3.11之前,这个WixBundleuil

在WIX自定义操作中,是否有方法检测MSI是否使用/silent或/quiet命令行开关调用?基本上,我想要的是不执行自定义操作(因为它显示一个表单),或者在传递这些命令行开关时以不同的方式处理它,但我无法找到这一点


是否有可能检测到它?

您可以检查属性并根据您的条件执行CA。

您可以检查属性并根据您的条件执行CA。

我终于找到了答案。Wix基本上总是将UILevel属性设置为2.0。它有自己的财产称为WixBundleUILevel。现在重要的是,在Wix 3.11之前,这个WixBundleuileLevel是一个内部属性,不能被捆绑项目或MSI自定义操作访问。这就是我所做的

  • 在MSI中定义了一个名为UI_LEVEL的属性(很重要,请使用大写)
  • 在Bundle.wxs中,在调用MSIPackage的地方,我将UI_级别属性设置为

  • 最后在自定义操作中,我检查如下属性

    int uiLevel;
                    if (int.TryParse(session["UI_LEVEL"], out uiLevel))
                    {
                        if (uiLevel == 4)
                            using (var form = new WhatsNew())
                            {
                                form.ShowDialog();
                            }
                        else
                            session.Log("Skipping What's new dialogue as UI Level is not 4");
    
                    }
                    else
                    {
                        session.Log("Couldnt figure out the UI level, so skipped the prompt");
                    }
    
    最后

    here are the possible values of this f**ed up property
                    WixBundleUILevel              Value     Burn parameters
                    BOOTSTRAPPER_DISPLAY_FULL       4         (none)
                    BOOTSTRAPPER_DISPLAY_PASSIVE    3         /silent
                    BOOTSTRAPPER_DISPLAY_NONE       2         /quiet
    

    我终于明白了。Wix基本上总是将UILevel属性设置为2.0。它有自己的财产称为WixBundleUILevel。现在重要的是,在Wix 3.11之前,这个WixBundleuileLevel是一个内部属性,不能被捆绑项目或MSI自定义操作访问。这就是我所做的

  • 在MSI中定义了一个名为UI_LEVEL的属性(很重要,请使用大写)
  • 在Bundle.wxs中,在调用MSIPackage的地方,我将UI_级别属性设置为

  • 最后在自定义操作中,我检查如下属性

    int uiLevel;
                    if (int.TryParse(session["UI_LEVEL"], out uiLevel))
                    {
                        if (uiLevel == 4)
                            using (var form = new WhatsNew())
                            {
                                form.ShowDialog();
                            }
                        else
                            session.Log("Skipping What's new dialogue as UI Level is not 4");
    
                    }
                    else
                    {
                        session.Log("Couldnt figure out the UI level, so skipped the prompt");
                    }
    
    最后

    here are the possible values of this f**ed up property
                    WixBundleUILevel              Value     Burn parameters
                    BOOTSTRAPPER_DISPLAY_FULL       4         (none)
                    BOOTSTRAPPER_DISPLAY_PASSIVE    3         /silent
                    BOOTSTRAPPER_DISPLAY_NONE       2         /quiet
    

    谢谢,我试过了,但不管通过与否,我的UILevel始终为2。我还注意到日志文件中的一些其他属性,如ClientUILevel和WixBundleUILevel,但我的会话参数始终为null。你知道我哪里会出错吗?@Nikhil,这很有趣,它没有改变;您是否以延迟方式运行CA?如果是这样,如果不将属性手动注入会话,您将无法访问数据库(即属性)。您好,不,我没有将其作为延迟运行。我在wixgithub上遇到一个注册问题,它声称引导程序覆盖UILevel属性并始终将其设置为2。但是没有关于这件事的最新消息。这里是链接,很高兴听到你解决了它。我一直在使用WiX v3.11.1,并且能够正常使用标准引导程序应用程序访问
    UILevel
    属性。谢谢Burrt。你介意分享一些你是如何做的代码示例吗?对我来说,用例是通过自定义操作(而不是延迟)访问它,这是MSI安装序列的一部分。这个MSI当时是引导程序的一部分。谢谢,我尝试了这个,但是不管通过与否,UILevel对我来说总是2。我还注意到日志文件中的一些其他属性,如ClientUILevel和WixBundleUILevel,但我的会话参数始终为null。你知道我哪里会出错吗?@Nikhil,这很有趣,它没有改变;您是否以延迟方式运行CA?如果是这样,如果不将属性手动注入会话,您将无法访问数据库(即属性)。您好,不,我没有将其作为延迟运行。我在wixgithub上遇到一个注册问题,它声称引导程序覆盖UILevel属性并始终将其设置为2。但是没有关于这件事的最新消息。这里是链接,很高兴听到你解决了它。我一直在使用WiX v3.11.1,并且能够正常使用标准引导程序应用程序访问
    UILevel
    属性。谢谢Burrt。你介意分享一些你是如何做的代码示例吗?对我来说,用例是通过自定义操作(而不是延迟)访问它,这是MSI安装序列的一部分。这个MSI当时是引导程序的一部分。