gpt4 book ai didi

mef - ImportMany 元数据未导入

转载 作者:行者123 更新时间:2023-12-04 17:16:53 24 4
gpt4 key购买 nike

几天来我一直在试图解决这个问题,但没有运气。

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

我一直在尽我所能地遵循示例,这是迄今为止我所拥有的。

[ImportMany]
public ObservableCollection<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList

这是它应该导入的内容:
[Export(typeof(IEditorSystem))]
[SignalSystemData("Very Very Long Name", "Short Name")]
public class MyEditorSystem: IEditorSystem
{
public MyEditorSystem()
{
}
}

和启动:
AggregateCatalog Catalog = new AggregateCatalog(
new DirectoryCatalog(@".\EditorSystems"),
new AssemblyCatalog(Assembly.GetExecutingAssembly()));
CompositionContainer Container = new CompositionContainer(Catalog);
Container.ComposeParts(this);

我可以在 Catalog.Parts 中看到 MyEditorSystem 和具有 ImportMany 的 View 模型,但 EditorSystemList 永远不会被填充。我没有收到任何组合错误。

我认为这可能与 Lazy<> 有关,所以我尝试了
public ObservableCollection<IEditorSystem> EditorSystemList

也没有运气。

我能想到的唯一复杂之处是我使用的是 Cinch,它使用 MEFedMVVM,它也使用 MEF。我不认为它会干扰,但我不确定。

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

更新:

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

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

最终找到了原因:如前所述,IEditorSystem 的实现位于单独的 DLL 中。
但是,不会将 dll 的任何新版本复制到主项目的输出子目录中。
我手动复制了第一个,忘记在 dll 项目中添加构建后副本。
哦,好吧,学到了很多关于 MEF 的东西,所以没有完全浪费时间:)

最佳答案

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

public ObservableCollection<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList  

应该
public IEnumerable<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList;

这是一个示例:
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; }
}

关于mef - ImportMany 元数据未导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3624878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com