WPF LifeCyle加载项

met*_*cam 3 wpf state vsto class-library dispatcher

我创建了一个加载项,通过反射调用WPF类库.由于这是一个类库,我不得不手动实例化new System.Windows.Application().

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

由于我的应用程序是一个加载项,Application仍然存在.因此,我只能将这种情况实例化一次.

在第一次启动时(Application is instanciated),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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

第二种方式:

        t_m = new Thread(loadDll);
        t_m.SetApartmentState(ApartmentState.STA);
        t_m.Start();
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jak*_*van 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
}
Run Code Online (Sandbox Code Playgroud)

应该解决它,它在过去对我来说工作得很好..