我创建了一个加载项,它通过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将“停止” (像旧帖子一样)
答案 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的方法),我们永远不会停止该线程(直到我们停止加载项),并且调度程序也永远不会停止。
顺便说一下,谢谢你的所有答案:)