MEF не распознает экспорт в Program Files (x86) - PullRequest
0 голосов
/ 08 сентября 2011

У меня проблема с тем, что MEF не экспортирует плагин, по-видимому, только при установке в c: \ Program Files (x86).

Я реализую довольно простую систему плагинов MEF для службы Windows.

Экспорт для 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 / Permissions?

Любая помощь приветствуется!

1 Ответ

1 голос
/ 08 сентября 2011

Это может быть то, где вы определяете 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 путь.

...