Я создал надстройку, которая вызывает через Reflection библиотеку классов WPF. Поскольку это библиотека классов, мне пришлось вручную создать экземпляр new System.Windows.Application()
.
Затем конструктор класса (тот, который вызывается через отражение) создает окно и Show() (с Dispatcher.Run(), чтобы избежать немедленного закрытия окна) или ShowDialog().
Поскольку мое приложение находится в надстройке, приложение все еще живо. Поэтому я могу создать экземпляр этого только один раз.
При первом запуске (когда создается экземпляр приложения) выполняется Application.Current.Dispatcher.
Но при втором запуске я понял, что Application.Current.Dispatcher был остановлен. Я никогда не вызываю InvokeShutdown(), поэтому не понимаю, когда 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 останавливается.
EDIT 2: Проблема во втором случае. Когда loadDll завершается, а затем я снова нажимаю кнопку надстройки, t_m останавливается, и создание еще одного не решает проблему, поскольку Dispatcher ManagedThreadId имеет старый t_m ManagerThreadId:/
EDIT 3: Проблема определенно не вызвана надстройкой. Если вы просто создадите программу, которая запускает поток каждый раз, когда вы нажимаете кнопку. Поток пытается создать экземпляр библиотеки классов DLL WPF (посредством отражения), и если вы нажмете эту кнопку во второй раз (вызовите другой поток), поскольку Dispatcher все еще «связан» со старым потоком, Dispatcher «остановлен» (как в старой теме)
Application
не любит иметь несколько экземпляров наAppDomain
... - person Merlyn Morgan-Graham   schedule 01.06.2011