编辑:我已经更新了下面的代码,以便它现在可以工作,这要归功于Rob的回答。如何在安装时在WiX中填充组合框?
我发现一对夫妇的展示了如何做到这一点的网页(http://www.cmcrossroads.com/content/view/13160/120/,http://www.mail-archive.com/[email protected]/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)上方运行过程中失败的码“执行期间函数失败,数据库:表更新失败”。 - 这是因为索引问题导致代码尝试将一个字符串写入一个int列。
2)如果我改变线
lRecord.SetString(2, lWebsiteName);
到
lRecord.SetString(2, lEntry.Name);
然后看着跟踪的动作看似成功,但安装程序运行时,组合框没有条目选择从。
如果我更改组合框的硬编码值,一切正常,即使我硬编码lWebsiteName的等效。
因此安装程序必须以管理员身份运行?或者当我试图获取网站列表时,如何避免访问被拒绝? – 2010-07-30 15:29:59
它必须以管理员身份运行。享受解决这个问题。 – jcmcbeth 2012-12-19 18:29:58