MEF导出组件中的自定义配置节

Mar*_*man 6 .net configuration mef

我有一个程序集,其中包含从不同程序集导入许多类的类,这些类在编译时未引用但在运行时通过目录编目发现.导出类希望在导入程序集的主机应用程序中为配置文件定义自定义配置节.但是,由于导入程序集的宿主应用程序在编译时不知道导出程序集,因此无法加载程序集以在其中使用自定义节处理程序实现.

我发现解决此问题的一种方法是将导出程序集放在与导入程序集的宿主应用程序程序集相同的文件夹中.但我想允许其他开发人员配置他们想要保存导出程序集的任何文件夹.

我能做的一件事是在启动时将开发人员配置文件夹的内容复制到主机的文件夹中.但是如果可以的话,我宁愿避免那些额外的移动部件和代码来维护.这有更好的方法吗?在查找定义自定义配置节的程序集时,有没有办法将应用程序指向其他目录?

Joa*_*opf 6

我在使用StructureMap动态发现程序集时遇到了同样的问题.ConfigurationManager似乎只在Bin-Folder和GAC中为ConfigurationSection查找指定的Assembly.即使将程序集加载到当前的AppDomain中,它似乎也不起作用.

但是,已经加载了ConfigurationSection的Assembly的事实可以用于一个简单的解决方法:

AppDomain.CurrentDomain.AssemblyResolve += (o, args) =>
        {
            var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
            return loadedAssemblies.FirstOrDefault(asm => asm.FullName == args.Name);
        };
Run Code Online (Sandbox Code Playgroud)

只要CLR找不到某个程序集,就会触发AssemblyResolve-Event.只需确保在第一次调用GetSection()之前注册回调.

适合我.