0

C# と Visual Studio 2010 を使用して、初めての Outlook 2010 アドインを開発しています。これまでのところ、私のプロジェクトは順調に進んでいます。リボンにカスタム タブがあり、Outlook ウィンドウで新しいメッセージが選択されるたびに更新されます。電子メールのテキストが分析され、さまざまな情報がリボンに表示されます。

これをすべて機能させるのは、私の ThisAddIn_Startup メソッドにあります。そこで、いくつかの Outlook イベントにバインドして、新しいメールが選択されたときにコードが適切に反応できるようにします。

本当に厄介なのは、これが約 1/3 の確率で断続的に失敗することです。当社にはさまざまなベンダーの Outlook アドインがいくつかあるため、Outlook の起動シーケンス中に何が起こっているのかを正確に知ることは困難です。コードが Outlook のイベントにバインドされる場合と、バインドされない場合があります。そうでない場合は、Outlook を閉じて再度開くと、機能します。アドバイスをいただければ幸いです。これを機能させるより良い方法はありますか?これらの断続的な起動エラーを予期する必要がある場合、アドインにこれ​​を認識させ、アプリの再起動を必要とせずに回復させる方法についてのアイデアはありますか?

ThisAddIn.cs からのコードのサンプルを次に示します。

private void ThisAddIn_Startup(object sender, System.EventArgs e) {
    // set up event handler to catch when a new explorer (message browser) is instantiated
    Application.Explorers.NewExplorer += new Microsoft.Office.Interop.Outlook.ExplorersEvents_NewExplorerEventHandler(NewExplorerEventHandler);

    // ...and catch any Explorers already existing before this startup event was fired
    foreach (Outlook.Explorer Exp in Application.Explorers) {
        NewExplorerEventHandler(Exp);
    }
}

public void NewExplorerEventHandler(Microsoft.Office.Interop.Outlook.Explorer Explorer) {
    if (Explorer != null) {
        //set up event handler so our add-in can respond when a new item is selected in the Outlook explorer window
        Explorer.SelectionChange += new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(ExplorerSelectionChange);
    }
}

private void ExplorerSelectionChange() {
    Outlook.Explorer ActiveExplorer = this.Application.ActiveExplorer();
    if (ActiveExplorer == null) { return; }
    Outlook.Selection selection = ActiveExplorer.Selection;
    Ribbon1 ThisAddInRibbon = Globals.Ribbons[ActiveExplorer].Ribbon1;

    if (ThisAddInRibbon != null) {
        if (selection != null && selection.Count == 1 && selection[1] is Outlook.MailItem) {
            // one Mail object is selected
            Outlook.MailItem selectedMail = selection[1] as Outlook.MailItem; // (collection is 1-indexed)
            // tell the ribbon what our currently selected email is by setting this custom property, and run code against it
            ThisAddInRibbon.CurrentEmail = selectedMail;
        } else {
            ThisAddInRibbon.CurrentEmail = null;
        }
    }
}

更新: イベントをキャッチしたい 2 つのオブジェクトの ThisAddIn クラスに 2 つの変数を追加しました。

Outlook.Explorers _explorers; // used for NewExplorerEventHandler
Outlook.Explorer _activeExplorer; // used for ExplorerSelectionChange event

ThisAddIn_Startup では:

_explorers = Application.Explorers;
_explorers.NewExplorer += new Microsoft.Office.Interop.Outlook.ExplorersEvents_NewExplorerEventHandler(NewExplorerEventHandler);

ExplorerSelectionChange で:

_activeExplorer = this.Application.ActiveExplorer();
4

1 に答える 1

3

COM オブジェクトを操作する場合: イベントをサブスクライブする場合は、オブジェクトへの参照をクラス/アプリケーション レベルで保持する必要があります。そうしないと、スコープ外になるとガベージ コレクションが実行されます。

于 2013-01-17T13:46:56.240 に答える