ImportMany元数据不导入

Kag*_*age 5 mef

我一直试图想这几天,没有运气.

我正在尝试使用[ImportMany]从一个充满DLL的目录导入IEditorSystem类型的导出,它具有IEditorSystemMetadata类型的自定义元目.我想首先获取元数据,并将其推送到一些文本框等,以便用户可以选择使用哪个EditorSystem,并在选择时加载该系统......

我一直在尽可能地遵循示例,这是我到目前为止所拥有的.

[ImportMany]
public ObservableCollection<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList
Run Code Online (Sandbox Code Playgroud)

这是它应该导入的内容:

[Export(typeof(IEditorSystem))]
    [SignalSystemData("Very Very Long Name", "Short Name")]
    public class MyEditorSystem: IEditorSystem
    {
        public MyEditorSystem()
        {
        }
    }
Run Code Online (Sandbox Code Playgroud)

和创业公司:

AggregateCatalog Catalog = new AggregateCatalog(
                new DirectoryCatalog(@".\EditorSystems"),
                new AssemblyCatalog(Assembly.GetExecutingAssembly()));
            CompositionContainer Container = new CompositionContainer(Catalog);
            Container.ComposeParts(this);
Run Code Online (Sandbox Code Playgroud)

我可以在Catalog.Part中看到MyEditorSystem和具有ImportMany的viewmodel,但是从未填充EditorSystemList.我没有写作错误.

我认为这可能与Lazy <>有关,所以我试过了

public ObservableCollection<IEditorSystem> EditorSystemList
Run Code Online (Sandbox Code Playgroud)

也没有运气.

我能想到的唯一复杂因素是我正在使用Cinch,它使用MEFedMVVM,它也使用MEF.我认为它不会干扰,但我不确定.

我想我做错了,有人能理解这个吗?

更新:

实现一个新的IComposer,其中包含您需要的目录.

虽然ImportMany仍然失败,但只有在我尝试使用它导入元数据时才会失败.元数据只是几个字符串,据我所知,遵循示例.

最后找到原因:IEditorSystem的实现是在一个单独的DLL中,如前所述.但是,dll的任何新版本都不会复制到主项目的输出子目录中.我手动复制了第一个,忘了将后期构建副本添加到dll项目中.哦,好好学习了一堆关于MEF的东西,所以不是完全浪费了几天:)

Jos*_*rga 1

在没有看到你的代码的情况下,我相信你需要改变的是

public ObservableCollection<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList  
Run Code Online (Sandbox Code Playgroud)

应该

public IEnumerable<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList;
Run Code Online (Sandbox Code Playgroud)

这是一个示例:

class Program
{
    static void Main(string[] args)
    {
        var c = new Class1();
        var v = c.EditorSystemList;
        foreach (var lazy in v)
        {
            if (lazy.Metadata.LongName == "Very Very Long Name")
            {
                var v2 = lazy.Value;
                // v2 is the instance of MyEditorSystem
            }
        }
    }
}

public class Class1
{
    [ImportMany]
    public IEnumerable<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList;

    public Class1()
    {
        var catalog = new AggregateCatalog(
            new AssemblyCatalog(Assembly.GetExecutingAssembly()));
        var container = new CompositionContainer(catalog);
        container.ComposeParts(this);
    }
}

[Export(typeof(IEditorSystem))]
[SignalSystemData("Very Very Long Name", "Short Name")]
public class MyEditorSystem : IEditorSystem { }

public interface IEditorSystem { }

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class SignalSystemDataAttribute : ExportAttribute
{
    public SignalSystemDataAttribute(string longName, string shortName)
        : base(typeof(IEditorSystem))
    {
        LongName = longName;
        ShortName = shortName;
    }
    public string LongName { get; set; }
    public string ShortName { get; set; }
}

public interface IEditorSystemMetadata
{
    string LongName { get; }
    string ShortName { get; }
}
Run Code Online (Sandbox Code Playgroud)