2011-02-01 77 views
3

我想創建一個WPF應用程序,該應用程序將成爲其他應用程序的中心點。主應用程序應該能夠根據用戶需求動態加載其他應用程序。經過一些研究,MEF似乎可能是解決這個問題的方法。使用WPF應用程序使用MEF運行多個不同的應用程序

我對MEF很新,所以我寫了一個測試應用程序,並試圖讓MEF工作。測試應用程序定義了一個非常基本的ITool界面。我能夠毫無困難地從類庫中導入多個類,但是我無法導入另一個WPF應用程序。 MEF有可能嗎?

我的主要WPF應用程序創建一個ToolContainer的實例,它創建和組成零件。

class ToolContainer 
{ 
    [ImportMany(typeof(ITool))] 
    IEnumerable<Lazy<ITool>> _tools; 

    private CompositionContainer _container; 

    public ToolContainer() 
    { 
     AggregateCatalog catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new DirectoryCatalog(
      "C:\\Application Development\\Tool Center\\Tool Extensions")); 

     _container = new CompositionContainer(catalog); 

     try 
     { 
      _container.ComposeParts(this); 
     } 
     catch (CompositionException compositionException) 
     { 
      //TODO: show error dialog 
     } 
    } 

} 

這裏是我創建了從itool用於繼承和出口的作品就好了多種類型的接口

public interface ITool 
{ 
    String ToolName { get; } 
    void OpenTool(); 
} 

。一個例子就是在這裏。

[Export(typeof(ITool))] 
public class Class1 : ITool 
{ 
    public String ToolName 
    { 
     get { return "....."; } 
    } 

    public void OpenTool() 
    { 
     //open the tool 
    } 
} 

現在我想導入繼承ITool接口的整個WPF應用程序。這裏的想法是,外部用戶可以創建自己的WPF應用程序,這些應用程序可以從主WPF應用程序運行。在未來,ITool界面將更加先進,但我正試圖讓基礎知識完成。我創建了一個新的測試WPF項目和修改App.xaml.cs是以下幾點:

[Export(typeof(ITool))] 
public partial class App : Application, ITool 
{ 
    public String ToolName 
    { 
     get { return "Tool Sample"; } 
    } 

    public void OpenTool() 
    { 
     //open the tool 
    } 
} 

當我這樣做_tools不包含我的新WPF應用程序,但包含的Class1。任何想法我做錯了什麼?有更好的方法嗎?任何幫助將不勝感激。

回答

6

默認情況下,DirectoryCatalog's constructor僅在目錄內搜索*.dll文件內的類型。您可以通過添加第二個目錄查找.NET可執行程序中的類型,像這樣讓這個「工作」:

AggregateCatalog catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(new DirectoryCatalog(
     "C:\\Application Development\\Tool Center\\Tool Extensions")); 
catalog.Catalogs.Add(new DirectoryCatalog(
     "C:\\Application Development\\Tool Center\\Tool Extensions", "*.exe")); 

話雖這麼說,我會建議反對這一點。我建議讓他們輸出一個UserControl來實現ITool,而不是讓用戶導出應用程序。由於「應用程序」實際上是按照自己的過程設計和預期運行,而不是在單個父進程中組成的,所以這將以更加期望的方式行事。

+0

感謝您的回覆。 – webe0316 2011-02-01 19:05:27

相關問題