編集: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;
}
以前は2つの問題がありました。
1)カスタムアクションの実行中に上記のコードが失敗し、「実行中に関数が失敗しました。データベース:テーブルの更新に失敗しました。」-これは、インデックスの問題により、コードがint列に文字列を書き込もうとしたことが原因でした。
2)行を変更した場合
lRecord.SetString(2, lWebsiteName);
に
lRecord.SetString(2, lEntry.Name);
次にトレースを見ると、アクションは成功したように見えますが、インストーラーを実行すると、コンボボックスには選択できるエントリがありません。
コンボボックスをハードコードされた値を持つように変更すると、lWebsiteNameと同等のものをハードコードした場合でも、すべてが正常に機能します。