3

私はAutofacを初めて使用し、問題を抱えています。

次のコードは、依存関係を登録する方法です。その後、両方 (blah1/blah2) が登録されていて、両方が「true」を返すかどうかを確認します。

public AddInBootstrapper(Microsoft.Office.Interop.Outlook.NameSpace session)
    {
        var containerBuilder = new ContainerBuilder();

        containerBuilder.Register(c => new OutlookService(session)).As<IOutlookService>();
        containerBuilder.RegisterType<EmailPrintService>().As<IPrintService<Microsoft.Office.Interop.Outlook.MailItem>>();

        _container = containerBuilder.Build();

        var blah1 = _container.IsRegistered<IOutlookService>();
        var blah2 = _container.IsRegistered<IPrintService<Microsoft.Office.Interop.Outlook.MailItem>>();
    }

後で配線された Outlook リボン ボタンをクリックすると、最初のボタン (blah1) はまだ登録済みとして表示され、2 番目のボタン (blah2) は「false」に戻ります。

private void printNowButton_Click(object sender, RibbonControlEventArgs e)
    {
        var blah1 = Globals.ThisAddIn.Core.IsRegistered<IOutlookService>();
        var blah2 = Globals.ThisAddIn.Core.IsRegistered<IPrintService<Microsoft.Office.Interop.Outlook.MailItem>>();

        var outlookSvc = Globals.ThisAddIn.Core.Resolve<IOutlookService>();
        var printSvc = Globals.ThisAddIn.Core.Resolve<IPrintService<Microsoft.Office.Interop.Outlook.MailItem>>();

        var folder = outlookSvc.GetFolder(@"public folders\all public folders\testpf\docprinttest\anotherfolder");

        foreach (Microsoft.Office.Interop.Outlook.MailItem item in folder.Items)
        {
            if (item.Attachments.Count > 0)
            {
                // print attachments
            }

            printSvc.PrintItem(item);
        }
    }

何か案は?

編集(残りのコードは次のとおりです):

Outlook アドインが読み込まれると、プロセスが開始されます。

public partial class ThisAddIn
{
    private AddInBootstrapper _core;
    public AddInBootstrapper Core
    {
        get { return _core; }
    }

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
    }

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    {
        _core.Dispose();
    }

    public override void BeginInit()
    {
        _core = new AddInBootstrapper(this.Application.Session);

        base.BeginInit();
    }

    // some VSTO generated code here (non-modified)
}

IPrintService.cs:

namespace MRP.Outlook.DocPrint.Core.Services.Interfaces
{
  public interface IPrintService<T>
  {
      void PrintItem(T item);
  }
}

EmailPrintService.cs:

namespace MRP.Outlook.DocPrint.Core.Services
{
  public class EmailPrintService : IPrintService<Microsoft.Office.Interop.Outlook.MailItem>
{
    public EmailPrintService()
    {
    }

    public void PrintItem(Microsoft.Office.Interop.Outlook.MailItem item)
    {
        //item.PrintOut();
        System.Diagnostics.Debug.WriteLine("Printing: " + item.Subject);
    }
  }
}

つまり、アドインが読み込まれ、両方が登録されます。ボタンをクリックすると、1 つは登録され、もう 1 つは登録されません。

4

1 に答える 1

3

完全に情報に基づいていない推測を行うにはMicrosoft.Office.Interop.Outlook.MailItem、組み込みの相互運用機能アセンブリに COM 型がありますか? (.NET 4 の「No PIA」機能を参照してください)。

その場合、型の複数のコピーが存在し、それらに適用された GUID によってのみ結合されている可能性があります。CLR はこれを許可し、それらを互いに割り当て可能として扱いますが、型を比較す​​ると (たとえば、登録を検索するために)、型が異なります。

直接的な回避策はわかりませんがMailItem、Outlook の型をラップする独自の型を作成することで、この理論を試すことができます。独自の型をジェネリック パラメーターとして使用すると、問題が解決するはずです。頑張ってください!

于 2012-07-20T18:09:47.447 に答える