我有一个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 /权限有关?
任何帮助表示赞赏!
答案 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
路径。