加载项中的WPF LifeCyle

| 我已经创建了一个加载项,它通过WPF类库Reflection进行调用。 由于这是一个类库,因此我不得不手动实例化一个“ 0”。 然后,类构造函数(通过反射调用的类)创建一个窗口,并设置Show()(使用Dispatcher.Run()以避免窗口立即关闭)或ShowDialog()。 由于我的应用程序已添加到加载项中,因此该应用程序仍然有效。 因此,我只能实例化一次。 在首次启动(实例化Application)时,Application.Current.Dispatcher正在运行。 但是在第二次启动时,我断言Application.Current.Dispatcher已停止。 我从不调用InvokeShutdown(),所以我不了解Dispatcher何时停止。 当我第二次启动此程序时,应用程序已经实例化(正常),但是Dispatcher停止了。 任何想法 ? 谢谢 ! 编辑:在我的加载项中,我尝试了2种方法: 第一种方式:
        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停止。 编辑2: 问题出在第二种方式。 当loadDll完成后,我再次单击我的加载项按钮时,t_m停止并且创建另一个t_m无法解决问题,因为Dispatcher ManagedThreadId具有旧的t_m ManagerThreadId:/ 编辑3: 这个问题肯定不是由外接程序引起的。 如果您只是创建一个每次单击按钮都会启动线程的程序。 该线程尝试实例化DLL WPF类库(通过反射),如果您再次单击该按钮(调用另一个线程),则由于Dispatcher仍“链接”到旧线程,因此Dispatcher为\ “已停止\”(类似于旧线程)     
已邀请:
        在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
}
那应该解决,过去对我来说效果很好。     
        最后,我使用无限循环将线程保持在运行状态,并使用AutoResetEvent / ManualResetEvent来启动/停止线程,从而解决了问题。 由于线程永远不会结束(并在接收到start事件时调用加载WPF UI dll的方法),因此我们永远不会停止线程(直到我们停止外接程序),并且调度程序也永远不会停止。 顺便说一句,谢谢你的所有回答:)     

要回复问题请先登录注册