2016-11-01 7 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); 
} 

И Bootstrapper

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

 Смежные вопросы

  • Нет связанных вопросов^_^