C# MEF-[ImportMany]使用ExportFactory<;T>;在WPF-.NET4.0中
我有一些需要创建多个实例的零件导入。通过四处搜索,我决定使用ExportFactory类。不幸的是,默认情况下WPF中不提供ExportFactory类,但幸运的是Glenn Block提供了 最初,我在导入时指定了类型:C# MEF-[ImportMany]使用ExportFactory<;T>;在WPF-.NET4.0中,c#,wpf,mef,C#,Wpf,Mef,我有一些需要创建多个实例的零件导入。通过四处搜索,我决定使用ExportFactory类。不幸的是,默认情况下WPF中不提供ExportFactory类,但幸运的是Glenn Block提供了 最初,我在导入时指定了类型: [ImportMany(typeof(IMyModule))] public IEnumerable<Lazy<IMyModule, IMyModuleMetadata>> Modules { get; set; } 我的导出如下所示: [Expor
[ImportMany(typeof(IMyModule))]
public IEnumerable<Lazy<IMyModule, IMyModuleMetadata>> Modules { get; set; }
我的导出如下所示:
[ExportMyModuleMetadata("Standard","Post Processor")]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class Module1 : IMyModuleData
上述措施效果良好。但一旦我将Lazy
更改为ExportFactory
时,我开始在编写过程中出错
[ImportMany(typeof(IMyModule))]
public IEnumerable<ExportFactory<IMyModule, IMyModuleMetadata>> Modules { get; set; }
我在某个地方看到(我现在找不到链接),在ImportMany
属性中指定Type
是问题所在。我想我可以不用它,所以我从ImportMany
中删除了该类型
[ImportMany()]
public IEnumerable<Lazy<IMyModule, IMyModuleMetadata>> Modules { get; set; }
我还发现了一个关于这方面的讨论,其中谈到了更多这方面的内容。一般来说,在.NET 4.0 ExportFactory上不支持开箱即用。ExportFactory是容器(或自定义导出提供程序)知道并专门处理的特殊类型,根据您收到的错误消息,该容器似乎不知道ExportFactory的任何特殊信息,因为它正试图将其强制转换为IMyModule 查看Glen对ExportFactory的测试您是否向容器中添加了Microsoft.ComponentModel.Composition.Hosting.ExportFactoryProvider
另外请注意,如果您有一个切换到.NET 4.5的选项,ExportFactory将受到开箱即用的支持 通常,在.NET 4.0 ExportFactory上不支持开箱即用。ExportFactory是容器(或自定义导出提供程序)知道并专门处理的特殊类型,根据您收到的错误消息,该容器似乎不知道ExportFactory的任何特殊信息,因为它正试图将其强制转换为IMyModule 查看Glen对ExportFactory的测试您是否向容器中添加了Microsoft.ComponentModel.Composition.Hosting.ExportFactoryProvider
另外请注意,如果您有一个切换到.NET 4.5的选项,ExportFactory将受到开箱即用的支持 我没有添加
ExportFactoryProvider
。我现在正在看样本项目。除了查看这个示例项目之外,是否还有关于ExportFactory
的文档可以帮助您?在浏览联机帮助时,我从未看到任何有关ExportFactoryProvider
的信息。添加ExportFactoryProvider
修复了该问题!谢谢我没有添加ExportFactoryProvider
。我现在正在看样本项目。除了查看这个示例项目之外,是否还有关于ExportFactory
的文档可以帮助您?在浏览联机帮助时,我从未看到任何有关ExportFactoryProvider
的信息。添加ExportFactoryProvider
修复了该问题!谢谢记住应用sky drive文件注释中提到的Jean Phillipe Leconte的修复:在第115行的ExportFactoryInstallationProvider中:if(cbid==null | | | |!cbid.RequiredTypeIdentity.StartWith(PartCreatorContractPrefix))应该是:if(cbid==null | | | cbid.RequiredTypeIdentity==null | | |!cbid.RequiredTypeIdentity.StartWith(PartCreatorContractPrefix)),因为当没有必需的类型(仅按名称导入)时,RequiredTypeIdentity(cbid.RequiredTypeIdentity)为null,因此在null字符串上调用StartWith。请记住应用sky drive文件注释中提到的Jean-Phillipe Leconte的修复:在ExportFactoryInstallationProvider的第115行中:if(cbid==null | | |!cbid.RequiredTypeIdentity.StartWith(PartCreatorContractPrefix))应为:if(cbid==null | | | cbid.RequiredTypeIdentity==null | |!cbid.RequiredTypeIdentity.StartWith(PartCreatorContractPrefix)),因为在没有所需类型(仅按名称导入)时,RequiredTypeIdentity(cbid.RequiredTypeIdentity)为null),从而在空字符串上调用StartsWith。
The export 'Module1 (ContractName="IMyModule")' is not assignable to type
'System.ComponentModel.Composition.ExportFactory`
[ImportMany()]
public IEnumerable<Lazy<IMyModule, IMyModuleMetadata>> Modules { get; set; }
var ep = new ExportFactoryProvider();
//Looks for modules in main assembly and scans folder of DLLs for modules.
var moduleCatalog = new AggregateCatalog(
new AssemblyCatalog(runningApp),
new DirectoryCatalog(".", "*.dll"));
var container = new CompositionContainer(moduleCatalog, ep);
ep.SourceProvider = container;
var Modules = new Modules();
container.ComposeParts(Modules);