Документация 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);