1

別の 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;
}

使用シナリオは簡単です。

  1. 「新しいメール」をクリックします。
  2. リボンのアドイン ボタンをクリックします。
  3. 電子メールを閉じます - 保存されていない変更プロンプトで [いいえ] を選択します。
  4. Outlook を閉じる - メール アイテムへの参照がリリースされていないことを示す、同じアイテムに対してさらに 2 つの「未保存の変更」プロンプトを受け取ります。

mail.PropertyAccessorこの問題は、 およびその後の への呼び出しにあるようReleaseComObjectです。これは参照を解放する必要があり、から返される参照カウントReleaseComObject DoWorkゼロですが、メソッドからこれらの行を削除すると、ステップ 4 で「未保存の変更」プロンプトが表示されないため、明らかにまだ参照があります。力ずくのMarshal.FinalReleaseComObject方法でも違いはありません。

また、mail.PropertyAccessorコードに本質的な問題はありません。これをメソッドの外に移動DoWorkし、リボン ボタンのクリック イベント ハンドラーに移動します。予想どおり、手順 4 で保存されていない変更のプロンプトは表示されません。

何が起きてる?

編集 1

また、別の AppDomain 内でアクセスされるプロパティにも違いがあるようです。PropertyAccessor問題を引き起こしますが、Recipientsしません。SessionApplicationAttachmentsすべて OK です。実際、これまでのところ、私が問題を発見した唯一の MailItem プロパティはPropertyAccessor.

4

0 に答える 0