加载项中的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为\ “已停止\”(类似于旧线程)
没有找到相关结果
已邀请:
2 个回复
弦砂牧扁
那应该解决,过去对我来说效果很好。
辅奈