Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 进口多个MEF装载合同两次_C#_.net_Wpf_Mef_Caliburn.micro - Fatal编程技术网

C# 进口多个MEF装载合同两次

C# 进口多个MEF装载合同两次,c#,.net,wpf,mef,caliburn.micro,C#,.net,Wpf,Mef,Caliburn.micro,我有两个类,它们导出IScreen,但当我使用 [ImportMany(typeof(IScreen))] private IEnumerable<Lazy<IScreen,IJIMSMetadata>> _modules; public IEnumerable<Lazy<IScreen, IJIMSMetadata>> Modules { get { return _modules; } } [ImportMany(typeof

我有两个类,它们导出IScreen,但当我使用

[ImportMany(typeof(IScreen))]
private IEnumerable<Lazy<IScreen,IJIMSMetadata>> _modules;
public IEnumerable<Lazy<IScreen, IJIMSMetadata>> Modules
{
        get { return _modules; }
}
[ImportMany(typeof(IScreen))]
私有IEnumerable_模块;
公共可数模
{
获取{return\u modules;}
}
这些模块包含四个IScreen实例,但我只导出了两个

这是集装箱

container = new CompositionContainer(
                new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)))                
                );


protected override IEnumerable<Assembly> SelectAssemblies()
{
    string _modulePath = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "Modules");
    var files = Directory.GetFiles(_modulePath, "*.dll", SearchOption.AllDirectories);

    List<Assembly> assemblies = new List<Assembly>();
    assemblies.Add(Assembly.GetExecutingAssembly());
    foreach (var file in files)
    {
        assemblies.Add(Assembly.LoadFrom(file));
    }
    return assemblies;
}
container=newcompositioncontainer(
新建AggregateCatalog(AssemblySource.Instance.Select(x=>new AssemblyCatalog(x)))
);
受保护的重写IEnumerable SelectAssemblys()
{
字符串_modulePath=Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.getExecutionGassembly().Location),“Modules”);
var files=Directory.GetFiles(_modulePath,*.dll,SearchOption.AllDirectories);
列表程序集=新列表();
Add(Assembly.getExecutionGassembly());
foreach(文件中的var文件)
{
Add(Assembly.LoadFrom(文件));
}
返回组件;
}

由于您使用的是AggregateCatalog,请检查以确保没有为包含执行程序集的位置同时添加AssemblyCatalog和DirectoryCatalog

例如,以下代码避免了对同一程序集进行两次处理

var catalog = new AggregateCatalog();
var locations = new List<string>();
foreach (var loc in GetPluginDirectories())
    if (!locations.Contains(loc))
    {
        catalog.Catalogs.Add(new DirectoryCatalog(loc));
        locations.Add(loc);
    }

var asm = Assembly.GetExecutingAssembly();
if (!locations.Contains(Path.GetDirectoryName(asm.Location)))
    catalog.Catalogs.Add(new AssemblyCatalog(asm));
var catalog=newaggregateCatalog();
变量位置=新列表();
foreach(GetPluginDirectories()中的var loc)
如果(!locations.Contains(loc))
{
catalog.Catalogs.Add(新目录目录(loc));
位置。添加(loc);
}
var asm=Assembly.getExecutionGassembly();
如果(!locations.Contains(Path.GetDirectoryName(asm.Location)))
catalog.Catalogs.Add(新组装目录(asm));

告诉我们您是如何构建CompositionContainer的容器使用assemby.load from Wild guess仅加载一个类,但是您的程序集是否位于某个位置,在该位置递归将加载“同一程序集”两次。例如,它通过
Debug
Release
文件夹递归?不,SaaAssembly只加载一次,您可以告诉我们导出
IScreen
的方式/位置吗?