2016-11-01 6 views
1

다른 어셈블리에서 가져 오기를 예상하는 WPF 프로젝트가 있습니다.MEF를 사용할 때 다른 어셈블리에서 가져 오기가 예외를 throw합니다.

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

나는 이것이 어떻게 가능한지 이해가 안 : 나는 FileViewModel 클래스를 내보낼 때

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; } 


    } 
} 

나는 오류가 발생합니다. 내가 찾은 대부분의 정보는 일치하지 않는 어셈블리 버전에 관한 것이지만, 나는 아주 기본적인 솔루션을 가지고 있으며 모든 프로젝트마다 동일한 버전이 있습니다.

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

당신은 SelectAssemblies 속성 오버라이드에서 어셈블리에 대한 CM을 말했습니까? 단지 응용 프로그램에서 어셈블리를 참조하는 것만으로 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