다른 어셈블리에서 가져 오기를 예상하는 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;
}
어떤 제안, 그 밖의 무엇을 나는이 문제를 해결하려고 할 수 있습니까?
네,로드 어셈블리가 올바르게 작동합니다. 디버깅 할 때 모든 어셈블리가 내 모듈 창에 있습니다. – FCin