Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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-[ImportMany]使用ExportFactory<;T>;在WPF-.NET4.0中_C#_Wpf_Mef - Fatal编程技术网

C# MEF-[ImportMany]使用ExportFactory<;T>;在WPF-.NET4.0中

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

我有一些需要创建多个实例的零件导入。通过四处搜索,我决定使用ExportFactory类。不幸的是,默认情况下WPF中不提供ExportFactory类,但幸运的是Glenn Block提供了

最初,我在导入时指定了类型:

[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);