別の AppDomains を読み込む Outlook アドインがあります。次に、Outlook (COM RCW) オブジェクトをこれらの AppDomains に渡します。この作業の基本は問題なく機能しますが、AppDomain 内から別のオブジェクト参照をフェッチすると、参照カウントが動かなくなるようです。
簡単な例として、Mail.Compose リボンにクリック ハンドラー付きのボタンがあります。このコードは、プライマリ Outlook アドイン AppDomain 内で実行されています。
var execAsm = System.Reflection.Assembly.GetExecutingAssembly();
var loadUri = new Uri(execAsm.CodeBase);
string loadDir = System.IO.Path.GetDirectoryName(loadUri.LocalPath);
// Create app-domain
AppDomainSetup appSetup = new AppDomainSetup();
appSetup.ApplicationBase = loadDir;
System.Security.PermissionSet permSet =
new System.Security.PermissionSet(
System.Security.Permissions.PermissionState.Unrestricted);
var myDomain = AppDomain.CreateDomain("MyDomain", null, appSetup, permSet, null);
// Get instance from app-domain
dynamic addInPoint = myDomain.CreateInstanceAndUnwrap(
assemblyName: "ClassLibrary1",
typeName: "ClassLibrary1.Class1");
// Do work on mail item
Outlook.MailItem currentMail =
Outlook.MailItem)Globals.ThisAddIn.Application.ActiveInspector()
.CurrentItem;
addInPoint.DoWork(currentMail);
// Clean-up
Marshal.ReleaseComObject(currentMail);
currentMail = null;
そして、Class
以下の実装。明確にするために、これは別の AppDomain 内でのみ実行されます。
public void DoWork(Outlook.MailItem mail)
{
mail.Save();
mail.To = "foobar@test.com";
var propAccessor = mail.PropertyAccessor;
Marshal.ReleaseComObject(propAccessor);
propAccessor = null;
}
使用シナリオは簡単です。
- 「新しいメール」をクリックします。
- リボンのアドイン ボタンをクリックします。
- 電子メールを閉じます - 保存されていない変更プロンプトで [いいえ] を選択します。
- Outlook を閉じる - メール アイテムへの参照がリリースされていないことを示す、同じアイテムに対してさらに 2 つの「未保存の変更」プロンプトを受け取ります。
mail.PropertyAccessor
この問題は、 およびその後の への呼び出しにあるようReleaseComObject
です。これは参照を解放する必要があり、から返される参照カウントReleaseComObject
はDoWork
ゼロですが、メソッドからこれらの行を削除すると、ステップ 4 で「未保存の変更」プロンプトが表示されないため、明らかにまだ参照があります。力ずくのMarshal.FinalReleaseComObject
方法でも違いはありません。
また、mail.PropertyAccessor
コードに本質的な問題はありません。これをメソッドの外に移動DoWork
し、リボン ボタンのクリック イベント ハンドラーに移動します。予想どおり、手順 4 で保存されていない変更のプロンプトは表示されません。
何が起きてる?
編集 1
また、別の AppDomain 内でアクセスされるプロパティにも違いがあるようです。PropertyAccessor
問題を引き起こしますが、Recipients
しません。Session
、Application
もAttachments
すべて OK です。実際、これまでのところ、私が問題を発見した唯一の MailItem プロパティはPropertyAccessor
.