2011-02-01 70 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

相关问题