MEF无法识别程序文件中的导出(x86)

时间:2011-09-08 11:29:22

标签: mef

我有一个MEF没有导出插件的问题,显然,只有当安装在c:\ Program Files(x86)中时才会出现。

我正在为Windows服务实现一个非常简单的MEF插件系统。

导出TestService.dll(插件)

[Export(typeof(IScheduledService))]
public class Service: IScheduledService
{ ... }

导入

public class ScheduledServices: IEnumerable<IScheduledService>
{
    [ImportMany(typeof(IScheduledService))]
    private List<IScheduledService> _services { get; set; }

    ...
}

组合物

var catalog = new DirectoryCatalog(PluginDirectory);
var container = new CompositionContainer(catalog);
container.ComposeParts(pluginCollection);

这在测试中运行良好并通过Windows窗体等驱动。它甚至可以在使用“InstallUtil”作为服务安装时起作用。但是当卷入Windows安装程序并安装在C:\ Program Files(x86)中时,它不会获取导出;

System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition
'TestService.Service' was ignored because it contains no exports.

我认为它必须与某种CAS /权限有关?

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

可能是您定义PluginDirectory的地方。如果您使用相对路径,例如.\plugins,可能是使用服务启动路径,而不是安装应用的位置,但安装了svchost.exe的地方C:\Windows\System32。当我在服务中使用MEF并想要使用相对路径时,我使用类似于:

的东西
private static readonly string CodeBase = typeof(MyService).Assembly.CodeBase;

public DirectoryCatalog GetCatalog(string relativePath)
{
  // Grab our codebase location as a Uri.
  Uri codeBase = new Uri(CodeBase);
  // Get the local path for the codebase.
  string path = codeBase.LocalPath.Substring(0, codeBase.LocalPath.LastIndexOf('\\');

  // Get the combined path
  path = Path.Combine(path, relativePath);

  return new DirectoryCatalog(path);
}

其中MyService是主程序集中的类型(也许是服务程序集?)。这可以确保我始终使用正确的应用程序路径(也支持程序集的卷影复制)。

检查您如何定义PluginDirectory路径。