[英]VSTO: Event Handler failing to fire after a reboot
我在Outlook的C#VSTO插件中遇到了一個問題。
啟動時注冊了一個事件處理程序,當選擇一個項目時,該事件處理程序將更新主資源管理器窗口的功能區上的按鈕。 最初(由Clickonce部署)時,該插件可完美運行。 更改選擇每次都會更新按鈕。
以下用於注冊事件處理程序的代碼:
Outlook.ExplorerEvents_10_SelectionChangeEventHandler selectionChangeEventHandler;
private void RegisterEvents(Outlook.Explorer Explorer)
{
try
{
log.Debug("Registering Events");
Application.Explorers.NewExplorer += Explorers_NewExplorer;
selectionChangeEventHandler = new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(ThisAddIn_SelectionChange);
Explorer.SelectionChange -= selectionChangeEventHandler;
Explorer.SelectionChange += selectionChangeEventHandler;
this.Application.OptionsPagesAdd -= Application_OptionsPagesAdd;
this.Application.OptionsPagesAdd += Application_OptionsPagesAdd;
Application.ItemSend -= Application_ItemSend;
Application.ItemSend += Application_ItemSend;
log.Debug("Events Registration Succeeded");
}
catch (Exception ex)
{
log.Debug("Event Registration Failed");
log.Error(ex.Message);
log.Error(ex.StackTrace);
}
}
private void Explorers_NewExplorer(Outlook.Explorer Explorer)
{
RegisterEvents(Explorer);
}
像這樣調用注冊方法
RegisterEvents(Application.ActiveExplorer());
但是,重新啟動后,事件處理程序將觸發兩次,然后再也不會觸發。
為了嘗試查找問題,如果在app.config中設置了字符串,我添加了一行來啟動調試器(如下所示)
if (String.Equals(ConfigurationManager.AppSettings.Get("attachDebugger"), "true", StringComparison.OrdinalIgnoreCase))
Debugger.Launch();
重新啟動后,我可以啟動Outlook,並觀察插件無法更新選擇。 在然后關閉Outlook中,在配置中切換attachDebugger標志,該按鈕將立即開始工作。
外接程序中的所有其他功能都可以正常工作,因此,外接程序不會處於停頓狀態。
我很茫然,不知道下一步該怎么做。 如果有人對重新啟動前后事件處理程序的運行方式為何有所不同感到驚訝(偶然卸載並重新安裝該插件會使其在該會話中再次起作用),我將不勝感激。 我也歡迎任何人的建議,這些人可以在問題無法在調試器下顯示時建議用於調試應用程序的方法。
您需要具有一個全局(類)變量,該變量存儲指向Explorer對象的指針。 否則,它將被垃圾收集器釋放。 如果不這樣做,它只會在發布之前觸發事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.