我有一個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