我创建了一个插件,通过反射调用一个WPF类库。
由于这是一个类库,我必须手动实例化一个
然后,类的构造函数(通过反射调用)创建一个窗口,并使用Show()(带有Dispatcher.Run()以避免窗口立即关闭)或ShowDialog()。
由于我的应用程序在插件中,Application仍然存在。 因此,我只能实例化一次。
在第一次启动(实例化Application时),Application.Current.Dispatcher正在运行。
但是在第二次启动时,我发现Application.Current.Dispatcher已经停止了。 我从未调用过InvokeShutdown(),因此我不明白Dispatcher何时停止。
当我第二次启动时,Application已经被实例化(这是正常的),但Dispatcher已经停止。
有什么想法吗? 谢谢!
编辑:在我的插件中,我尝试了两种方法:
new System.Windows.Application()
。然后,类的构造函数(通过反射调用)创建一个窗口,并使用Show()(带有Dispatcher.Run()以避免窗口立即关闭)或ShowDialog()。
由于我的应用程序在插件中,Application仍然存在。 因此,我只能实例化一次。
在第一次启动(实例化Application时),Application.Current.Dispatcher正在运行。
但是在第二次启动时,我发现Application.Current.Dispatcher已经停止了。 我从未调用过InvokeShutdown(),因此我不明白Dispatcher何时停止。
当我第二次启动时,Application已经被实例化(这是正常的),但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);
}
}
当我直接从Add-In中调用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: 问题绝对不是由Add-in引起的。 如果您只是创建一个程序,每次单击按钮时都会启动一个线程。 该线程尝试通过反射实例化DLL WPF类库,并且如果您第二次单击此按钮(调用另一个线程),则由于Dispatcher仍然“链接”到旧线程,因此Dispatcher将“停止”(如旧线程)
Application
不喜欢在同一AppDomain
中有多个实例... - Merlyn Morgan-Graham