2012-02-14 83 views
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?有小费吗?

回答

0

我认为最好的办法是计划CA是同步检查退出代码,并让您的CA使用取消按钮显示它自己的模式对话框,告诉您扫描正在进行中。然后使用BackgroundProcess类旋转扫描,同时检查是否选择了取消。完成后(对于真实或取消)设置状态属性并返回成功。

然后在您的MSI控制事件中,您可以检查该属性,并根据业务规则禁止转换到下一个对话框或允许它(互斥控制事件条件)。

+0

你是指从自定义操作调用的spawn对话框?我不知道如何显示自定义操作的产卵对话框,也不知道如何使用BackgroundProcess类。我应该将网络扫描的东西移动到后台线程并退出线程吗?用户单击取消按钮?我知道如何使用winforms窗口来做到这一点,但我不知道如何在这种情况下使用wix spawn对话框。你能解释一下吗? – user1209216 2012-02-14 18:09:21

+0

不,在这种情况下,我实际上是说要在.NET中处理UI。您的第一个对话框将调用DoAction YourCustomAction,您的自定义操作将弹出一个前景模态对话框,显示进度并允许取消,同时允许取消操作。我发现后台进程易于使用,但如果你知道如何使用线程也可以。 – 2012-02-14 18:19:57

+0

好吧,但据我所知(纠正我,如果我错了),只有在wix安装过程中显示模式对话框的方法是使用spawn对话框。直接使用.net创建的任何类型的gui(例如winformms)将永远都是无模式的,它甚至可以出现在安装程序窗口的下方 - 这是不可接受的。所以 - 要清楚:你的意思是我应该调用标准的.net对话框(winforms窗口)或某种wix/msi对话框?在第一种情况下 - 似乎不可能使其成为模态,在第二种情况下,我不知道如何使用这种对话框来中断我的网络扫描线程 – user1209216 2012-02-14 18:42:56