编辑:我已更新下面的代码,感谢Rob的答案。
我找到了几个页面来展示如何实现这个功能 (http://www.cmcrossroads.com/content/view/13160/120/, http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg05103.html) 并查看了WAI的源代码 (http://wai.codeplex.com/),但无论我尝试什么都不能在我的安装程序中使其正常工作。如果有人能发现我的错误,我将非常感激。我的WiX对话框片段如下所示:
<UI>
<Dialog>
...snip...
<Control Id="WebsiteName" Type="ComboBox" ComboList="yes" Sorted="yes" Property="IIS_WEBSITENAME" X="20" Y="73" Width="150" Height="17"/>
...snip...
<!-- We want our custom action to fill in the WebsiteName ComboBox above
however, if no ComboBox entries exist at compile time then the
ComboBox table is not created in the MSI and we can't add to it in
the custom action. So we have this hidden dummy list box to force
the table to appear. -->
<Control Id="DummyComboBox" Hidden="yes" Type="ComboBox" Sorted="yes" ComboList="yes" Property="DUMMYPROPERTY" X="65" Y="60" Width="150" Height="18">
<ComboBox Property="DUMMYPROPERTY">
<ListItem Text="Dummy" Value="Dummy"/>
</ComboBox>
</Control>
</Dialog>
</UI>
<Property Id="DUMMYPROPERTY">Dummy</Property>
<Property Id="IIS_WEBSITENAME"/>
<CustomAction Id="FillWebsiteNameList" BinaryKey="WiXCustomAction.dll" DllEntry="FillWebsiteNameList" Execute="immediate" />
<InstallUISequence>
<Custom Action="FillWebsiteNameList" After="CostFinalize"/>
</InstallUISequence>
我的自定义操作代码是:
[CustomAction]
public static ActionResult FillWebsiteNameList(Session xiSession)
{
xiSession.Log("Begin FillWebsiteNameList");
xiSession.Log("Opening view");
View lView = xiSession.Database.OpenView("SELECT * FROM ComboBox");
lView.Execute();
xiSession.Log("Creating directory entry");
DirectoryEntry lIis = new DirectoryEntry("IIS://localhost/w3svc");
xiSession.Log("Checking each child entry");
int lIndex = 1;
foreach (DirectoryEntry lEntry in lIis.Children)
{
if (lEntry.SchemaClassName == "IIsWebServer")
{
xiSession.Log("Found web server entry: " + lEntry.Name);
string lWebsiteName = (string)lEntry.Properties["ServerComment"].Value;
xiSession.Log("Website name: " + lWebsiteName);
xiSession.Log("Creating record");
Record lRecord = xiSession.Database.CreateRecord(4);
xiSession.Log("Setting record details");
lRecord.SetString(1, "IIS_WEBSITENAME");
lRecord.SetInteger(2, lIndex);
lRecord.SetString(3, lEntry.Name); // Use lWebsiteName only if you want to look up the site by name.
lRecord.SetString(4, lWebsiteName);
xiSession.Log("Adding record");
lView.Modify(ViewModifyMode.InsertTemporary, lRecord);
++lIndex;
}
}
xiSession.Log("Closing view");
lView.Close();
xiSession.Log("Return success");
return ActionResult.Success;
}
过去存在两个问题:
1)上述代码在运行自定义操作时失败,并显示“执行期间出现功能故障。数据库:表格更新失败。”——这是由于索引问题导致代码试图将字符串写入整数列。
2)如果我更改该行
lRecord.SetString(2, lWebsiteName);
为了
lRecord.SetString(2, lEntry.Name);
当查看跟踪时,操作似乎成功了,但是当安装程序运行时,组合框中没有可供选择的条目。
如果我将组合框更改为硬编码值,则一切正常工作,即使我硬编码等效于 lWebsiteName。