【问题标题】:Custom configuration sections in MEF exporting assembliesMEF 导出程序集中的自定义配置部分
【发布时间】:2011-06-18 06:19:53
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您设法找到问题的答案,我很乐意阅读它,因为我面临一个非常相似的问题。

标签: .net configuration mef


【解决方案1】:

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

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

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

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

为我工作。

【讨论】:

  • 优秀的解决方案约阿希姆,谢谢!我已经完成了这项工作,但是我遇到了一些问题,因为请求的程序集(args.Name)在字符串中没有版本和区域性组件,但加载的程序集(asm.FullName)有。所以字符串匹配不起作用。当我逐步完成时,其他请求的程序集具有版本和文化,但由于某种原因,我感兴趣的特定程序集没有。因此,我将搜索修改为 asm.FullName.Contains(args.Name)。知道为什么版本和文化不会成为对一个程序集的请求的一部分,而是对其他程序集的请求吗?
  • 谢谢,这是有道理的!附:你可以只写loadedAssemblies.FirstOrDefault( a => a.FullName == args.Name ); 而不是使用额外的Where。 ;p
【解决方案2】:

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

您可能会将您的模块路径附加到 AppDomain 用于汇编解析的私有 bin 路径。通过添加额外的路径,它允许解析当前未加载的程序集。

【讨论】:

  • 马修-谢谢。具有节处理程序的模块在 MEF 组合实例化它之后进行调用 - 所以我假设它当时已加载到 AppDomain 中(这实际上是我对无法解析处理程序类型感到惊讶的原因)。不同的一件事是我没有像您描述的那样调用 ConfigurationManager.GetSection。相反,我从 ConfigurationManager.OpenExeConfiguration 获取配置,然后调用 Configuration.GetSection。不确定这是否会产生任何影响,但我会尝试 ConfigurationManager.GetSection 方法并查看。
猜你喜欢
  • 2010-10-20
  • 2012-05-11
  • 2010-12-13
  • 2011-11-04
  • 2011-09-16
  • 1970-01-01
  • 2010-10-25
  • 2016-07-19
相关资源
最近更新 更多