У меня есть внешнее приложение, которое предоставляет событие StkQuit
.
Я подписываюсь на это событие в статическом классе, который обрабатывает всю связь между моим приложением и [внешним] приложением. Я хотел бы подписаться на событие StkQuit
, используя другой обработчик, который находится на моем классе формы.
Этот обработчик проинформирует пользователя о том, что внешнее приложение закрыто. Я хотел бы иметь общий метод в статическом классе SubscribeToStkQuit
, который принимает делегат в качестве параметра и подписывает этот делегат (ссылающийся на обработчик в моем классе формы) на событие StkQuit
.
Возможно ли это? Является ли это самым элегантным/упрощенным способом достижения такой функциональности?
Мой пример кода:
Класс формы
public delegate void dForceClose();
public void SubscribeToStkQuit(dForceClose forceClose)
{
UtilStk.SubscribeToStkQuit(forceClose = new dForceClose(ForceClose));
}
private void ForceClose()
{
MessageBox.Show("TEST");
}
Статический класс
private static AgUiApplication _stkUiApplication;
public static void SubscribeToStkQuit(Delegate subscribeHandler)
{
_stkUiApplication.OnQuit += subscribeHandler;
}
[Обновление]
В соответствии с комментариями я обновил код следующим образом:
public delegate void dForceClose(object sender, EventArgs e);
public void SubscribeToStkQuit(dForceClose forceClose)
{
UtilStk.SubscribeToStkQuit(forceClose = new dForceClose(ForceClose));
}
private void ForceClose(object sender, Eventargs e)
{
MessageBox.Show("TEST");
}
Я все еще получаю исключение. Любые идеи?
[Обновить # 2]
У меня все еще есть проблемы с этим. В моем статическом классе у меня есть обработчик уже, когда срабатывает OnQuit
:
private static AgUiApplication _stkUiApplication;
public static bool CheckThatStkIsAvailable()
{
object stkApplication = null;
try
{
stkApplication = Marshal.GetActiveObject(_stkProgId);
_stkUiApplication = stkApplication as AgUiApplication;
_stkUiApplication.OnQuit += StkQuit;
return true;
}
catch (Exception)
{
// handle this
}
}
private static void StkQuit()
{
_stkUiApplication.OnQuit -= StkQuit;
Marshal.FinalReleaseComObject(_stkUiApplication);
Marshal.FinalReleaseComObject(_stkRoot);
}
Это прекрасно работает. Поэтому я решил создать публичное свойство для _stkUiApplication и подписаться с классом формы таким же образом:
Статический класс
public static AgUiApplication StkUiApplication
{
get { return _stkUiApplication; }
}
Класс формы
private void SubscribeToStkQuit()
{
UtilStk.StkUiApplication.OnQuit += StkQuit;
}
private void StkQuit()
{
MessageBox("TEST");
}