1
我已经定义了扫描LAN网络计算机的自定义操作。这个动作被声明为直接和用户点击对话框按钮后触发:WIX - 从背景更改对话框文本标签立即自定义操作
<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;
}
有2个主要问题是:
行动阻止,所以安装程序窗口冻结,直到nb.getNetworkComputers重新运行。如果我将action返回声明为asyncWait,则会执行操作,但检索的值不会插入ComboBox。另外,我需要一些标签来指示操作进度,例如:“扫描网络,请稍候”,并在扫描结束后隐藏此标签。
这可能与wix?有小费吗?
你是指从自定义操作调用的spawn对话框?我不知道如何显示自定义操作的产卵对话框,也不知道如何使用BackgroundProcess类。我应该将网络扫描的东西移动到后台线程并退出线程吗?用户单击取消按钮?我知道如何使用winforms窗口来做到这一点,但我不知道如何在这种情况下使用wix spawn对话框。你能解释一下吗? – user1209216 2012-02-14 18:09:21
不,在这种情况下,我实际上是说要在.NET中处理UI。您的第一个对话框将调用DoAction YourCustomAction,您的自定义操作将弹出一个前景模态对话框,显示进度并允许取消,同时允许取消操作。我发现后台进程易于使用,但如果你知道如何使用线程也可以。 – 2012-02-14 18:19:57
好吧,但据我所知(纠正我,如果我错了),只有在wix安装过程中显示模式对话框的方法是使用spawn对话框。直接使用.net创建的任何类型的gui(例如winformms)将永远都是无模式的,它甚至可以出现在安装程序窗口的下方 - 这是不可接受的。所以 - 要清楚:你的意思是我应该调用标准的.net对话框(winforms窗口)或某种wix/msi对话框?在第一种情况下 - 似乎不可能使其成为模态,在第二种情况下,我不知道如何使用这种对话框来中断我的网络扫描线程 – user1209216 2012-02-14 18:42:56