Visio 相互運用機能を利用する C# アプリケーションを作成しました。イベント関連の問題で困惑しています。再現する手順:
- Visio を起動
- アプリケーションを起動します。Visio インスタンスが取得され、オブジェクト モデルが使用可能になり、アプリでイベントが受信および処理されます。
- アプリを閉じて、Visio を開いたままにします。
- アプリを起動します。Visio インスタンスが取得され、オブジェクト モデルを使用できますが、アプリがイベントを受信しません。
アプリが開くと、次を使用して、開いている Visio アプリのインスタンスを取得します。
visioApp = (Microsoft.Office.Interop.Visio.Application)Marshal.GetActiveObject("Visio.Application");
次のようにイベントを登録します。
visioApp.DocumentOpened += new EApplication_DocumentOpenedEventHandler(onDocOpened);
アプリがシャットダウンしたら、次のようにイベントの登録を解除します。
visioApp.DocumentOpened -= onDocOpened;
visioApp = null;
アプリのシャットダウン時にインスタンスを適切に登録解除/解放していないようですが、それは単なる推測です。アプリを 2 回目に起動すると、エラーは発生しません。イベントに応答しないだけです。これ以上の関連情報をオンラインで見つけることができませんでした (おそらく、正しい用語を検索していないだけです)。どんな助けでも大歓迎です!役に立つかもしれない情報をさらに提供します。
@オスカーの答えは正しかった:
Marshal.FinalReleaseComObject(_ap);
ただし、もう 1 つ問題がありました。Marshal.finalReleaseComObject がクラス デストラクタで呼び出されていましたが、アプリケーションのシャットダウン シーケンスで呼び出しが遅すぎたようで (ガベージ コレクションを強制したとしても)、参照を適切に解放していませんでした。このコードを以前に (MainForm_Closing イベントで) 呼び出すと、うまく機能します。助けてくれてありがとう!