.net 第一次调用CompositionContainer.GetExportedValueOrDefault需要35秒以上

.net 第一次调用CompositionContainer.GetExportedValueOrDefault需要35秒以上,.net,mef,.net,Mef,我试图了解我们在使用MEF时犯了什么错误 下面是初始化容器的方法: var files = Directory.GetFiles(bin, "*.dll").Where(file => !Excluded.Contains(Path.GetFileName(file))).ToArray(); var filesexe = Directory.GetFiles(bin, "*.exe").Where(file => !Excluded.Contains(Path.GetFileNam

我试图了解我们在使用MEF时犯了什么错误

下面是初始化容器的方法:

var files = Directory.GetFiles(bin, "*.dll").Where(file => !Excluded.Contains(Path.GetFileName(file))).ToArray();
var filesexe = Directory.GetFiles(bin, "*.exe").Where(file => !Excluded.Contains(Path.GetFileName(file))).ToArray();
var catalog = new AggregateCatalog( files.Concat(filesexe).Select(file => new AssemblyCatalog(file)));
m_container = new CompositionContainer(catalog, true);
给定该容器,我们调用
GetExportedValue或default
GetExportedValue
来实际解析根级别的依赖关系。尽管通常,它们是通过导入构造函数或属性自动解析的

应用程序在开始时调用
GetExportedValueOrDefault
方法来执行某些关键验证,如果验证失败,必须立即中止应用程序

我们的问题是,对
GetExportedValueOrDefault
方法的第一次调用现在大约需要35秒

我们使用的是.NET4.5附带的标准MEF。这个应用程序相当大,并且通过MEF注入了相当多的类,但是花费35秒似乎不符合逻辑

此延迟可能是逐渐累积的,但现在它大于启动windows服务的服务控制管理器超时。所以我们增加了超时时间,但这不是我们正在寻找的解决方案

此时迁移到Microsoft.Composition(又名MEF-2)是不可行的

使用RedGate的ANTS profiler进行分析,可以得出以下结论:

这给了我什么也没有,除了有一些疯狂的思考正在进行。我不明白如何进一步进行。我该如何排除故障


有什么想法吗?

只是猜测,但为每个文件创建目录是问题的一部分吗?你试过目录目录吗?是的,它是一样的。问题是MEF检查给定程序集中每个类型中的每个字段、属性和方法。大部分时间都花在反射基础结构内部-请参阅探查器快照。我希望我能说MEF不要检查方法,因为我们不[导入]方法。只要跳过方法反射,就会大大缩短启动时间。但是MEF本身是使用它所要解决的同样糟糕的模式来编写的,所以除了编写我们自己的类型目录之外,没有办法连接到TypeCatalog,我们不愿意这样做。