C#MEF目录';具有相同DLL文件名的意外结果

C#MEF目录';具有相同DLL文件名的意外结果,c#,wpf,mef,C#,Wpf,Mef,我正在开发一些支持MEF插件特性的WPF应用程序。它通过从DirectoryCatalog获取导出来创建插件,如 DirectoryCatalog catalog = new DirectoryCatalog(@".\libs", fileName); CompositionContainer container = new CompositionContainer(catalog); BaseModel.Instance.ImportedPlugins = container.GetExpor

我正在开发一些支持MEF插件特性的WPF应用程序。它通过从DirectoryCatalog获取导出来创建插件,如

DirectoryCatalog catalog = new DirectoryCatalog(@".\libs", fileName);
CompositionContainer container = new CompositionContainer(catalog);
BaseModel.Instance.ImportedPlugins = container.GetExports<IExternalServiceProvider>();
我尝试了几个场景,但这让我更加困惑

案例1

Debug
ㄴlibs
  ㄴFILENAME.dll(latest version)
ㄴApp.exe
ㄴFILENAME.dll(old version)

->已加载旧版本

案例2

Debug
ㄴlibs
  ㄴFILENAME.dll(latest version)
ㄴApp.exe
ㄴFILENAME.dlllll(old version)

->已加载最新版本

案例3

Debug
ㄴlibs
  ㄴFILENAME.dll(latest version)
ㄴApp.exe
ㄴWRONGFILENAME.dll(old version)

->已加载最新版本

案例4(最容易混淆的案例)

->未能加载其中任何一个


我可能会尝试使用Catalog的不同方法来解决这个加载问题,但我无法找到案例4发生的原因和方式。我做错了什么?

DirectoryCatalog使用的是搜索模式,而不是文件名。如果您正在传递完整的文件名(“filename.dll”),filename.dlllll或errowfilename.dll仍将匹配搜索模式,我猜。此外,DirectoryCatalog还会检查给定路径(“.\libs”在此处)是否为根路径。您可以尝试使用:newdirectorycatalog(@“libs”和“*.dll”)?我试过了,基本上都是一样的。。。我想它可能至少显示了两个组件(旧版本和新版本),但它不是…这可能是一个很长的拍摄时间,但你能检查是否有融合错误。我已经描述了一些诊断步骤。我在那里处理的案件似乎与你描述的不同,但也许答案有助于在黑暗中获得一些光明。如果你发现了什么,请在你的问题中说明。谢谢你提供的信息。我尝试了fuslogvw和Fusion++,根据日志,程序集加载的默认行为似乎是首先加载工作目录,因为它的时间戳说明显示它试图加载正确的版本,但它的日志显示它在成功加载工作目录上的dll时完成了查找dll的过程,我最终使用了“assemblycalog(new Assembly.LoadFrom(path))”,但没有确定发生了什么,因为至少它几乎按照我的预期工作,我没有更多的时间去了解。无论如何,谢谢你的帮助,抱歉没有更多的数据
Debug
ㄴlibs
  ㄴFILENAME.dll(latest version)
ㄴApp.exe
ㄴWRONGFILENAME.dll(old version)

Debug
ㄴlibs
  ㄴWRONGFILENAME.dll or FILENAME.dlllll(latest version)
ㄴApp.exe
ㄴFILENAME.dll(old version)