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

时间:2011-01-30 21:56:10

标签: .net configuration mef

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

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

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

适合我。

答案 1 :(得分:0)

据我所知,配置部分仅在通过GetSection()访问时才会被读取。如果您的模块代码是唯一调用ConfigurationManager.GetSection("myModuleConfigSection")的东西,那么它可能无关紧要,因为此时程序集已加载到AppDomain。如果在将程序集加载到AppDomain之前正在读取该部分,那么我会想到你会抛出异常。

您可以将模块路径附加到AppDomain用于装配解析的专用bin路径。通过添加其他路径,它允许解析当前未加载的程序集。