2016-11-01 65 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

相關問題