別の 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.