我一直在試圖找出這幾天,沒有運氣。ImportMany與元數據無法導入
我試圖使用[ImportMany]從一個完整的DLL目錄中導入類型爲IEditorSystem的導出,該導入具有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,但EditorSystemList永遠不會被填充。我沒有得到組合錯誤。
我認爲它可能有一些做的懶惰<>,所以我嘗試
public ObservableCollection<IEditorSystem> EditorSystemList
沒有任何運氣。
我能想到的唯一複雜因素是我使用的是使用MEFedMVVM的Cinch,它也使用MEF。我不想認爲它干涉,但我不確定。
我想我做錯了,任何人都可以理解這一點嗎?
更新:
實現新的IComposer,與正是你所需要的目錄。
雖然ImportMany仍然失敗,但只有當我嘗試導入元數據時纔會這樣。元數據僅僅是一對字符串,並且就我能夠確定的而言,遵循這些示例。
最終找到原因:如前所述,IEditorSystem的實現位於獨立的DLL中。 但是,任何新版本的dll都不會複製到主項目的輸出子目錄中。 我已經手動複製了第一個,並忘記將後生成的副本添加到dll項目。 哦,學到了一堆關於MEF的東西,所以不能完全浪費天:)
我將其更改爲IEnumerable,但導入從未似乎完成,EditorSystemList保持在[0] ... – Kage 2010-09-03 03:48:55
您是否嘗試運行上面的確切代碼?你應該能夠創建一個控制檯應用程序來測試。 – JoshVarga 2010-09-03 15:06:05
是的,控制檯版本可以工作,但它看起來可能是由於MEFedMVVM搞砸了,會更新 – Kage 2010-09-04 09:28:42