C# 使用MEF时,从其他程序集导入会引发异常
我有一个WPF项目,它需要从其他程序集导入C# 使用MEF时,从其他程序集导入会引发异常,c#,wpf,import,mef,caliburn.micro,C#,Wpf,Import,Mef,Caliburn.micro,我有一个WPF项目,它需要从其他程序集导入 namespace DrawMe.Core.ViewModels { public class MenuBarViewModel : Conductor<IMenuBarItem> { [Import(typeof(IMenuBarItem))] public IMenuBarItem Item { get; set; } public MenuBarViewModel()
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; }
}
}
我不明白这怎么可能。我发现的大多数信息都是关于不匹配的程序集版本的,但我有一个非常基本的解决方案,每个项目都有相同的版本
我尝试使用惰性项
,但这会导入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);
}
public static readonly string ExtensionFolderPath=Path.GetFullPath(Path.GetDirectoryName(Assembly.getExecutionGassembly().Location)+“\\Extensions”);
私有静态只读目录DirectoryCatalog=newdirectorycatalog(ExtensionFolderPath);
私有静态只读CompositionContainer=新的CompositionContainer(DirectoryCatalog);
公共静态无效注入(T obj),其中T:class
{
集装箱组件(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;
}
受保护的重写IEnumerable SelectAssemblys()
{
var assemblies=Directory.GetFiles(mefinject.ExtensionFolderPath,“*.dll”,SearchOption.AllDirectories)。选择(Assembly.LoadFrom.ToList();
Add(Assembly.getExecutionGassembly());
返回组件;
}
有什么建议吗,我还可以尝试解决这个问题吗?您是否在SelectAssemblys属性覆盖中告诉CM有关程序集的信息,只是在应用程序中引用程序集并不会告诉CM有关它的信息
受保护的重写IEnumerable SelectAssemblys()
{
var assemblies=base.SelectAssemblies();
var directory=newdirectoryinfo(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));
返回组件。Concat(模块);
}
您是否在SelectAssemblys属性覆盖中告诉CM有关程序集的信息,仅在应用程序中引用程序集不会告诉CM有关它的信息
受保护的重写IEnumerable SelectAssemblys()
{
var assemblies=base.SelectAssemblies();
var directory=newdirectoryinfo(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));
返回组件。Concat(模块);
}
所以,我想我把它修好了。老实说,我不知道出了什么问题。我刚刚删除了我的项目并创建了一个新项目。我用完全相同的方法做每件事,现在它起作用了。也许是程序集不匹配的问题,但考虑到我已多次清理文件夹,我真的不知道这怎么可能…所以,我想我已经解决了它。老实说,我不知道出了什么问题。我刚刚删除了我的项目并创建了一个新项目。我用完全相同的方法做每件事,现在它起作用了。可能是程序集不匹配的问题,但考虑到我已多次清理文件夹,我真的不知道这怎么可能…是的,我有,加载程序集是正确的。调试模块窗口时,我的每个程序集都在我的模块窗口中。是的,我有它并且加载程序集工作正常。调试模块窗口时,每个程序集都在其中。
protected override IEnumerable<Assembly> SelectAssemblies()
{
var assemblies = Directory.GetFiles(MefInjector.ExtensionFolderPath, "*.dll", SearchOption.AllDirectories).Select(Assembly.LoadFrom).ToList();
assemblies.Add(Assembly.GetExecutingAssembly());
return assemblies;
}
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);
}