2016-11-01 35 views
1

我有一个WPF项目需要从其他程序集导入。从另一个程序集导入使用MEF时抛出异常

namespace DrawMe.Core.ViewModels 
{ 
    public class MenuBarViewModel : Conductor<IMenuBarItem> 
    { 
     [Import(typeof(IMenuBarItem))] 
     public IMenuBarItem Item { get; set; } 

     public MenuBarViewModel() 
     { 
      MefInjector.Inject(this);  
     } 
    } 
} 


namespace DrawMe.MenuBarItems.ViewModels 
{ 
    [Export(typeof(IMenuBarItem))] 
    public class FileViewModel : Screen, IMenuBarItem 
    { 
     public string Name { get; set; } 
     public List<IMenuBarOption> Options { get; set; } 


    } 
} 

当我出口FileViewModel类,我得到错误:

The export 'DrawMe.MenuBarItems.ViewModels.FileViewModel (ContractName="DrawMe.Api.Models.MenuBar.IMenuBarItem")' is not assignable to type 'DrawMe.Api.Models.MenuBar.IMenuBarItem'. 

我不明白这是怎么可能的。我发现的大部分信息都是关于程序集版本不匹配的,但我有一个非常基本的解决方案,每个项目都有相同的版本。

我试着用Lazy<IMenuBarItem> Item,但进口null

另外我使用MefInjector,所以我可以从MainViewModel以外的其他类别进口产品。

public static readonly string ExtensionFolderPath = Path.GetFullPath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\Extensions"); 
private static readonly DirectoryCatalog DirectoryCatalog = new DirectoryCatalog(ExtensionFolderPath); 
private static readonly CompositionContainer Container = new CompositionContainer(DirectoryCatalog); 

public static void Inject<T>(T obj) where T : class 
{ 
    Container.ComposeParts(obj); 
} 

而且引导程序

protected override IEnumerable<Assembly> SelectAssemblies() 
     { 
      var assemblies = Directory.GetFiles(MefInjector.ExtensionFolderPath, "*.dll", SearchOption.AllDirectories).Select(Assembly.LoadFrom).ToList(); 
      assemblies.Add(Assembly.GetExecutingAssembly()); 
      return assemblies; 
     } 

任何建议,还有什么我可以尝试解决这一问题?

回答

0

所以,我想我修好了。说实话,我不知道什么是错的。我刚刚删除了我的项目并创建了一个新项目。我做了一切完全相同的方式,现在它的工作。也许是与不匹配组件的问题,但我真的不知道如何做到这一点是可能考虑到我打扫我的文件夹了许多遍

0

你告诉CM有关SelectAssemblies属性重写组装,只知道一味引用的应用程序不告诉CM它装配。 http://caliburnmicro.com/documentation/bootstrapper

protected override IEnumerable<Assembly> SelectAssemblies() 
    { 
     var assemblies = base.SelectAssemblies(); 

     var directory = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory); 
     var files = directory.GetFiles("*.dll", SearchOption.TopDirectoryOnly); 
     var modules = files.Where(f => f.Name.Contains("SomeAssemblyNamespacePrefixorProjectName")) 
            .Select(f => Assembly.LoadFile(f.FullName)); 

     return assemblies.Concat(modules); 

    } 
+0

是的,我把它和装载组件的工作原理是正确的。当我调试它时,我的模块窗口中有每个程序集。 – FCin