我有一个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;
}
任何建议,还有什么我可以尝试解决这一问题?
是的,我把它和装载组件的工作原理是正确的。当我调试它时,我的模块窗口中有每个程序集。 – FCin