我已定义扫描局域网网络计算机的自定义操作。此操作被声明为立即并在用户单击对话框按钮后触发:
<CustomAction Id="actionGetNetworkComputers" BinaryKey="actionBinary" DllEntry="GetNetworkComputers" Execute="immediate" Return="check"/>
Custiom行动代码:
public static ActionResult GetNetworkComputers(Session session)
{
ListNetworkComputers.NetworkBrowser nb = new ListNetworkComputers.NetworkBrowser();
Microsoft.Deployment.WindowsInstaller.View lView = session.Database.OpenView("DELETE FROM ComboBox WHERE ComboBox.Property='SERVER_LIST'");
lView.Execute();
lView = session.Database.OpenView("SELECT * FROM ComboBox");
lView.Execute();
int Index = 1;
try
{
foreach (string s in nb.getNetworkComputers())
{
Record lRecord = session.Database.CreateRecord(4);
lRecord.SetString(1, "SERVER_LIST");
lRecord.SetInteger(2, Index);
lRecord.SetString(3, s);
lRecord.SetString(4, s);
lView.Modify(ViewModifyMode.InsertTemporary, lRecord);
++Index;
}
}
catch (Exception ex)
{
session.Log(ex.StackTrace);
}
lView.Close();
return ActionResult.Success;
}
这有两个主要问题:
操作正在阻止,因此安装程序窗口会冻结,直到nb.getNetworkComputers重新出现。如果我将操作返回声明为asyncWait,则会执行操作,但检索到的值不会插入到ComboBox中。另外,我需要一些指示操作进度的标签,例如:“扫描网络,请稍候”并在扫描结束后隐藏此标签。
wix有可能吗?有什么提示吗?
答案 0 :(得分:0)
我认为解决此问题的最佳方法是安排CA是同步检查退出代码并让您的CA显示自己的模式对话框,并带有取消按钮,告诉您扫描正在进行中。然后使用BackgroundProcess类来旋转扫描,同时检查是否选择了取消。完成后(真实或取消)设置状态属性并返回成功。
然后在您的MSI控件事件中,您可以检查该属性,并根据您的业务规则禁止转换到下一个对话框或允许它(互斥控件事件条件)。