2010-06-16 67 views
1

我有一个需要在IIS6和IIS7上支持的设置。现在即时通讯使用内置的IIS扩展名IIS6像这样:有条件的安装功能在Wix中不起作用

  <Component Id="C_IISApplication" Guid="{9099909C-B770-4df2-BE08-E069A718B938}" >      
       <iis:WebSite Id='TSIWSWebSite' Description='TSWeb' SiteId='*' Directory='INSTALLDIR'>       
        <iis:WebAddress Id='tcpAddress' Port='8081' /> 
       </iis:WebSite> 
       <iis:WebAppPool Id="BlahWSApplicationPool" Name="Blah" /> 
       <iis:WebVirtualDir Id="VirtualDir" 
            Alias="Blah" 
            Directory="INSTALLDIR" 
            WebSite="BlahWSWebSite" 
            DirProperties="WebVirtualDirProperties"> 

        <iis:WebApplication Id="WebApplication" 
             Name="Blah" 
             WebAppPool="BlahWSApplicationPool"/> 

       </iis:WebVirtualDir> 
      </Component> 

我在功能尝试了条件,像这样:

<Feature Title="IIS6" Id="IIS6" Description="IIS6" ConfigurableDirectory="INSTALLDIR" Level="1" Absent="disallow" Display="hidden"> 
     <ComponentRef Id="C_IISApplication" /> 
     <Condition Level="0"><![CDATA[IISVERSION <> '#6']]></Condition> 
    </Feature> 

不管是什么我条件的值,元数据库东西得到执行,并在IIS7系统上出现错误。

我也曾尝试把在组件的条件和没有工作要么。

有什么错我的使用情况?

回答

1

我给你的问题是在哪里是IISVERSION属性设置。我没有在WIX中使用IIS模式,但其他扩展的内置属性用它们的模式记录,我没有在IIS模式的文档中看到IISVERSION。我在这里找到了这个参考WiX tricks and tips在注册表中搜索IIS的版本号(如果按投票计数排序,这是第二个提示/提示)。

如果你已经使用该方法来填充属性,那么我会看看检查,你确定WiX会从注册表中返回版本号的“#6”吗?编辑:主要版本是DWORD SO#6是正确的。

编辑: 重新读取问题和'样本'我还将功能级别设置为0和条件,所以它会激活该功能,如果IISVERION = 6。它更容易阅读为积极的a负。

但所有他这样说是IISVERSION被设置

+1

是的,我检查是否IISVERSION是通过在检索值之后创建条件消息来设置,并且它确实返回#6或#7。 我也同意设置级别= 1和条件=#6,因为它更易于阅读...它实际上我做了什么orginally但我一直在尝试不同的组合,试图让病情不安装该功能。 – Damien 2010-06-16 04:30:41

+0

我做了一些更多的测试,并从该功能中删除了Display =“hidden”属性。 我现在可以看到该功能在IIS7机器上的功能对话框中不可见,并且在IIS6机器上可见。所以我不明白为什么它执行配置数据库事务,如果没有安装组件,不能找到IIS机器。 如果没有安装相应的组件,我会认为IIS架构中的自定义操作都将被跳过。 – Damien 2010-06-16 05:09:26

0

据我所知,从标准WiX的扩展(如IIsExtension)的自定义操作绑定到组件的条件执行。

而且,目前尚不清楚其中IISVERSION财产从何而来,但IIsExtension公开,并设置正确自己的属性称为IISMAJORVERSION和IISMINORVERSION。所以,在你的情况下,IISMAJORVERSION将参与组件条件。

我有我的解决方案类似的代码:

<Fragment> 
     <PropertyRef Id="IISMAJORVERSION"/> 
     <PropertyRef Id="IISMINORVERSION"/> 
     ... 

     <!-- This component is to be installed on IIS 6. It creates a new site with the name provided by user --> 
     <Component DiskId="1" Id="CreateIISSite6" Guid="{GUID}" Directory="WebsiteFolder"> 
     <Condition>IISMAJORVERSION = "#6" AND CREATE_IIS_SITE</Condition> 
     <CreateFolder/> 
     <iis:WebSite Id="NewIISSite6" SiteId="[IISSITE_ID]" Description="[IISSITE_NAME]" AutoStart="yes" Directory="WebsiteFolder" WebApplication="IISSiteApplication6" DirProperties="IISRootWebDirProperties"> 
      <iis:WebAddress Id="NewIISSiteAddress6" Header="[IISSITE_HEADER]" Port="[IISSITE_PORT]" /> 
     </iis:WebSite> 
     </Component> 
     ... 
    </Fragment> 

希望这有助于。

+0

谢谢,我最终通过创建覆盖执行顺序中的customaction来解决它,如果IISVERSION不是#6,则不执行CONFIGUREIIS。 但是你的方式确实看起来更好,再加上我从来不知道这些Wix扩展属性:) – Damien 2010-06-17 00:02:21

+0

你所说的InstallExecuteSequence条件是一个'全有或全无'开关。将来您可能需要更灵活的解决方案,并且您必须找到其他方法。 – 2010-06-17 06:47:46

0

你有没有尝试删除Absent=disallow属性?文档称这将强制安装该功能,而不管其可见性如何。我所知道的级别设置为0应该禁用完全的功能,但我不知道是否Absent=disallow覆盖此行为......

无论如何,如果你的工作方式......