一千萬個為什麽

搜索

如何使用托管擴展性框架releaseExport部件

我知道 CompositionContainer.ReleaseExport()的工作原理如下:

  1. 它執行部件的Dispose方法;
  2. 它從CompositionContainer中刪除了部分。

我附上了一個簡短的程序。程序運行時,我希望看到

  1. 文本“這是Foo.Dispose”在控制臺窗口中,
  2. 在調試器中,composablePartCatalog.Parts計數應為零。

事實並非如此。任何人都可以對此有所了解嗎?

在回應Daniel Plaisted的回復時,我簡化了示例程序。我仍然沒有在控制臺窗口中看到文本“這是Foo.Dispose”。

namespace MefCa06
{
  using System;
  using System.ComponentModel.Composition;
  using System.ComponentModel.Composition.Hosting;
  using System.Reflection;

  [
      ExportAttribute
    , PartCreationPolicyAttribute(CreationPolicy.NonShared)
  ]
  public class Foo : IDisposable
  {
    public void ShowMessage()
    {
      Console.WriteLine("this is Foo.ShowMessage");
    }

    public void Dispose()
    {
      Console.WriteLine("this is Foo.Dispose");
    }
  }

  class Program
  {
    [ImportAttribute]
    public Foo FooProperty { get; set; }

    static void Main(string[] args)
    {
      Program program = new Program();

      CompositionContainer compositionContainer =
        new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
      compositionContainer.ComposeParts(program);

      program.FooProperty.ShowMessage();

      Lazy foo = compositionContainer.GetExport();
      compositionContainer.ReleaseExport(foo);

      Console.ReadLine();
    }
  }
}

最佳答案

你應該在控制臺中看到“這是Foo.Dispose”。

目錄中仍應包含該部分。目錄包含零件定義,容器包含零件。 Foo的部分/實例將從容器中處理和刪除,但定義仍將在目錄中。由於定義仍在目錄中,因此您可以使用另一個GetExport調用創建另一個定義。

轉載註明原文: 如何使用托管擴展性框架releaseExport部件