从WIX安装程序启动使用WPF编写的CustomAction UI:STAThread问题失败

时间:2012-01-13 18:48:58

标签: wpf wix

My WIX安装程序立即启动自定义操作。 自定义操作启动一个WPF对话框,提示用户输入BD连接参数(我基本上在WPF中编写了'新连接'数据库提示符对话框,以获取自定义操作可以在已安装的应用程序的配置文件中注入的连接字符串)。 WIX代码很容易理解,我知道我执行自定义操作就好了 - 我在调用自定义操作方法时放了一个MessageBox和一个MmsiBreak。我没有问题就到了那儿。 当自定义操作实例化我的WPF对话框窗口时,我得到一个InvaliOperationException:“调用线程必须是STA,因为许多UI组件需要这个”。

当我将它放在标准WPF应用程序中时,相同的代码运行正常,因为VisualStudio使用Main()生成具有STAThreadAttribute的样板代码。 我无法在msiexec调用者上添加该属性,如果我尝试在自定义操作中设置线程单元状态,则会失败:

Thread.CurrentThread.SetApartmentState(ApartmentState.STA);

不应该为2.0以后的框架工作。

有没有办法做我想在这里做的事情?我很欣赏一些指示。


修改

我甚至尝试在自己的线程中运行对话框,例如代码是这样的:

// Static class members
static ManualResetEvent _done = new ManualResetEvent(false);
static ActionResult _caResult;
static Session _session;
static Thread _worker;

[CustomAction]
static public ActionResult PromptForDB(Session session)
{
    _session = session;
    _worker = new Thread(WorkerThread);
    _worker.Start();
    _done.WaitOne();
    return _caResult;
}

[STAThread]
static void WorkerThread()
{
    try
    {
        Prompter wnd = new Prompter();
        if (!(bool)wnd.ShowDialog())
        {
            _caResult = ActionResult.SkipRemainingActions;
        }
        else
        {
            // Harvest our properties (omitted from this post)
            _caResult = ActionResult.Success;
        }
        catch (Exception ex)
        {
            _caResult = ActionResult.Failure;
            _session.Log("Error: " + ex.Message);
        }
        finally
        {
            _done.Set();
        }
    }

这也不起作用。

1 个答案:

答案 0 :(得分:3)

在开始新线程之前,请按如下方式设置其ApartmentState:

_worker.SetApartmentState(ApartmentState.STA);

见这个:
The calling thread must be STA, because many UI components require this in WPF