加载项中的WPF生命周期

时间:2011-06-01 07:31:47

标签: wpf vsto state dispatcher class-library

我创建了一个加载项,它通过Reflection调用WPF类库。 由于这是一个类库,我必须手动实现new System.Windows.Application()

然后,类构造函数(通过反射调用的那个)创建一个窗口,Show()(使用Dispatcher.Run()以避免窗口立即关闭)或ShowDialog()。

由于我的应用程序是加载项,因此应用程序仍处于活动状态。 因此,我只能实现一次。

在第一次启动时(当应用程序实例化时),Application.Current.Dispatcher正在运行。

但在第二次发布时,我确定Application.Current.Dispatcher已停止。 我从不调用InvokeShutdown(),所以我不明白Dispatcher何时停止。

当我第二次启动此应用程序时,应用程序已经实现(这是正常的)但Dispatcher已停止。

有什么想法吗? 谢谢!

编辑:在我的加载项中,我尝试了两种方法:

第一种方式:

        foreach (Type type in ass2_l.GetTypes())
        {
            if (type.Name == "Loader")
            {
                object obj_l = Activator.CreateInstance(type);
                BindingFlags bf_l = BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
                object[] argList_l = new object[1];
                argList_l[0] = "ok";
                type.InvokeMember("Load", bf_l, null, obj_l, argList_l);
            }
        }

当我直接从加载项调用dll时,Application.Current.Dispatcher处于后台状态,名称为“VSTA_Main”。 当我第二次启动时,Dispatcher仍处于后台状态。

第二种方式:

        t_m = new Thread(loadDll);
        t_m.SetApartmentState(ApartmentState.STA);
        t_m.Start();

loadDll实际上包含“第一路”代码的相同代码。 当我第一次启动这个部件时,Dispatcher正在运行,一切都很正常。 第二次启动时,Dispatcher会停止。

编辑2: 问题在于第二种方式。 当loadDll完成然后再次单击我的加载项按钮时,t_m停止并创建另一个不能解决问题,因为Dispatcher ManagedThreadId具有旧的t_m ManagerThreadId:/

编辑3: 问题肯定不是由加载项引起的。 如果您只是创建一个程序,每次单击按钮时启动一个线程。 该线程尝试实现DLL WPF类库(通过反射),如果您再次单击此按钮(调用另一个线程),因为Dispatcher仍然“链接”到旧线程,Dispatcher将“停止” (像旧帖​​子一样)

2 个答案:

答案 0 :(得分:7)

在ThisAddin.Startup事件处理程序中输入以下代码:

private void ThisAddInStartup(object sender, EventArgs e)
{
    if (System.Windows.Application.Current == null)
        new System.Windows.Application();
    System.Windows.Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown
}

应该解决这个问题,过去它对我来说很好。

答案 1 :(得分:1)

最后,我使用无限循环来解决问题,使线程保持运行状态,使用AutoResetEvent / ManualResetEvent来启动/停止线程......

由于线程永远不会完成(并且在接收到启动事件时调用加载WPF UI dll的方法),我们永远不会停止该线程(直到我们停止加载项),并且调度程序也永远不会停止。

顺便说一下,谢谢你的所有答案:)