В надстройке Outlook VSTO C # не позволяет подключать обработчик событий к Application.Quit - PullRequest
1 голос
/ 11 июня 2019

Документация Microsoft гласит (https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2010/ee720183(v=office.14)#practice-2-detecting-when-outlook-is-shutting-down)

Чтобы обнаружить, что Outlook закрывается, вы можете использовать событие Quit объекта Application в объектной модели Outlook, чтобы получить уведомление о том, что процессзавершение работы. Убедитесь, что вы быстро отреагировали на событие и максимально быстро вернули контроль в Outlook.

Но, похоже, это можно сделать только в VB.Net, C # не позволит мне. Существует метод с именем Quit (), а также событие с именем Quit, и когда я пытаюсь подключить обработчик события к этому событию, компилятор C # говорит, что нельзя использовать + = в группе методов.

Кстати, я пытался: вы не можете создавать что-либо с событием и методом с одинаковым именем в C #. Язык не позволяет этого.

Примерниже приведен код шаблона проекта VSTO для подключаемого модуля Outlook с добавлением только метода QuitHandler и попыткой привязать его к событию Quit.

При вводе кода будет отображаться intellisense.w и событие Quit, и метод Quit на выбор, но выбор события приводит к коду, который не компилируется.

Есть ли способ явно сообщить компилятору, что это событие quit вы собираетесь использовать?

namespace OutlookAddIn2
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            Application.Quit += MyQuitHandler;
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
            // Note: Outlook no longer raises this event. If you have code that 
            //    must run when Outlook shuts down, see https://go.microsoft.com/fwlink/?LinkId=506785
        }

        void MyQuitHandler()
        {

        }

        #region VSTO generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }

        #endregion
    }
}

Вывод компилятора (вы можете игнорировать предупреждение en-US, у меня было, что во всех версиях Visual Studio, насколько моя память возвращается, AFAICT это вызваноустановив Office и Visual Studio на одну и ту же машину.)

1>------ Build started: Project: OutlookAddIn2, Configuration: Debug Any CPU ------
1>CSC : warning CS2038: The language name 'en-US' is invalid.
1>D:\Temp\OutlookAddIn2\ThisAddIn.cs(7,10,7,26): error CS1656: Cannot assign to 'Quit' because it is a 'method group'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Проблема не возникает, когда я пытаюсь сделать то же самое в VB.Net, компилируется нормально:

Public Class ThisAddIn

    Private Sub ThisAddIn_Startup() Handles Me.Startup
        AddHandler Application.Quit, AddressOf MyQuitHandler
    End Sub

    Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown

    End Sub

    Private Sub MyQuitHandler()

    End Sub

End Class

Это использует Vusual Studio 2017 с Resharper 2017.3.1.

Я не думаю, что Resharper виноват в данном конкретном случае: я видел похожие сообщения об ошибках, когда его кэш символов работает плохо, но это никогда не приводит кв коде, который не компилируется.Напротив, это приводит к тому, что код компилируется и работает несмотря на ошибки, которые указывает редактор кода.

[Edit] Кстати, он тоже не работает, я бы предположилв любом случае неявно

Application.Quit += new ApplicationEvents_11_QuitEventHandler(MyQuitHandler);

1 Ответ

0 голосов
/ 11 июня 2019

Дубликат Нет события выхода из приложения в Outlook?

Ответ (который я проверял и подтверждал на работу):

((Outlook.ApplicationEvents_11_Event)Application).Quit 
+= new Outlook.ApplicationEvents_11_QuitEventHandler(ThisAddIn_Quit);

void ThisAddIn_Quit()
{
   System.Windows.Forms.MessageBox.Show("bye bye problem, I found the solution!!");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...