使用 MEF 时从另一个程序集导入会引发异常
Import from another assembly throws exception when using MEF
我有一个 WPF 项目需要从其他程序集导入。
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
class 时出现错误:
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
,所以我可以从 classes 导入而不是 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;
}
任何建议,我还能尝试解决这个问题吗?
您是否在 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);
}
所以,我想我已经修好了。老实说,我不知道出了什么问题。我刚刚删除了我的项目并创建了一个新项目。我以完全相同的方式做了所有事情,现在它可以工作了。也许这是不匹配程序集的问题,但考虑到我多次清理文件夹,我真的不知道这怎么可能...
我有一个 WPF 项目需要从其他程序集导入。
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
class 时出现错误:
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
,所以我可以从 classes 导入而不是 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;
}
任何建议,我还能尝试解决这个问题吗?
您是否在 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);
}
所以,我想我已经修好了。老实说,我不知道出了什么问题。我刚刚删除了我的项目并创建了一个新项目。我以完全相同的方式做了所有事情,现在它可以工作了。也许这是不匹配程序集的问题,但考虑到我多次清理文件夹,我真的不知道这怎么可能...