Состав MEF, когда приложение находится в сети - PullRequest
5 голосов
/ 26 марта 2012

У меня есть MEF-приложение, которое отлично работает при локальном запуске, но не работает при удаленном вызове с общего сетевого ресурса.

Я использую Assembly.LoadFrom, чтобы избежать проблем с UNC, но вижу каквсе библиотеки находятся рядом с exe, я не думал, что это будет проблемой, но я пытался это любым способом.

Я также исправил проблемы ConfigurationManager.GetSection, которые, по-видимому, являются общей проблемой с разрешениями .NET 4, после просмотра msdn .

Я разрешаю <loadFromRemoteSources enabled="true"/> в конфигурационном файле.Поэтому я не уверен, где может быть проблема.

Редактировать: Исключением является ProductDispatcher в каталоге.Parts.

Код, устанавливающийКонтейнер и каталог:

var catalog = new AggregateCatalog();

var dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

foreach (string file in Directory.GetFiles(dir, "XXX*.dll"))
{
    var assembly = Assembly.LoadFrom(file);
    catalog.Catalogs.Add(new AssemblyCatalog(assembly));
}

var container = new CompositionContainer(catalog);
var batch = new CompositionBatch();
batch.AddPart(this);
container.Compose(batch);

Импорт (который я пытался обнародовать):

[ImportMany(typeof(IEntityTypeDispatcher))]
private IEnumerable<IEntityTypeDispatcher> Dispatchers { get; set; }

Пример экспорта:

[Export(typeof(IEntityTypeDispatcher))]
internal class ContactDispatcher : EntityTypeDispatcher<Contact>

Я получаю исключительную ошибку:

The composition produced a single composition error. The root cause is provided below. Review the CompositionException.Errors property for more detailed information.

1) Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

Resulting in: An exception occurred while trying to create an instance of type 'XXX.XXX.Dispatch.ProductDispatcher'.

Resulting in: Cannot activate part 'XXX.XXX.Dispatch.ProductDispatcher'.
Element: XXX.XXX.Dispatch.ProductDispatcher -->  XXX.XXX.Dispatch.ProductDispatcher -->  AssemblyCatalog (Assembly="XXX.XXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")

Resulting in: Cannot get export 'XXX.XXX.Dispatch.ProductDispatcher (ContractName="XXX.XXX.Dispatch.IEntityTypeDispatcher")' from part 'XXX.XXX.Dispatch.ProductDispatcher'.
Element: XXX.XXX.Dispatch.ProductDispatcher (ContractName="XXX.XXX.Dispatch.IEntityTypeDispatcher") -->  XXX.XXX.Dispatch.ProductDispatcher -->  AssemblyCatalog (Assembly="XXX.XXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")

Resulting in: Cannot set import 'XXX.XXX.Dispatch.DispatcherRepository.Dispatchers (ContractName="XXX.XXX.Dispatch.IEntityTypeDispatcher")' on part 'XXX.XXX.Dispatch.DispatcherRepository'.
Element: XXX.XXX.Dispatch.DispatcherRepository.Dispatchers (ContractName="XXX.XXX.Dispatch.IEntityTypeDispatcher") -->  XXX.XXX.Dispatch.DispatcherRepository
 (System.ComponentModel.Composition.CompositionException)

   at System.ComponentModel.Composition.CompositionResult.ThrowOnErrors(AtomicComposition atomicComposition)
   at System.ComponentModel.Composition.Hosting.ComposablePartExportProvider.Compose(CompositionBatch batch)
   at System.ComponentModel.Composition.Hosting.CompositionContainer.Compose(CompositionBatch batch)
   at XXX.XXX.Dispatch.DispatcherRepository.LoadDispatchers() in D:\Workspaces\XXX\Branches\Dev1\XXX.XXX\XXX.XXX\Dispatch\DispatcherRepository.cs:line 71
   at XXX.XXX.Dispatch.DispatcherRepository.get_Instance() in D:\Workspaces\XXX\Branches\Dev1\XXX.XXX\XXX.XXX\Dispatch\DispatcherRepository.cs:line 34
   at XXX.XXX.Dispatch.DispatcherRepository.GetDispatchers() in D:\Workspaces\XXX\Branches\Dev1\XXX.XXX\XXX.XXX\Dispatch\DispatcherRepository.cs:line 21
   at XXX.XXX.Dispatch.Dispatcher.get_Instance() in D:\Workspaces\XXX\Branches\Dev1\XXX.XXX\XXX.XXX\Dispatch\Dispatcher.cs:line 30
   at XXX.XXX.Broker..ctor() in D:\Workspaces\XXX\Branches\Dev1\XXX.XXX\XXX.XXX\Broker.cs:line 52

Похоже, что MEF работает не слишком хорошо в сценариях частичного доверия.Что мне нужно сделать, чтобы все работало под полным доверием?

1 Ответ

3 голосов
/ 30 марта 2012

Несмотря на то, что вы включили «загрузку из удаленных источников», это может происходить, потому что файлы могут иметь ограничения на них.

NTFS поддерживает возможность применять метаданные к файлу в альтернативном потоке данных (ОБЪЯВЛЕНИЯ).Это будет включать информацию о Зоне (например, Зона Интернета и т. Д.).

Это может быть причиной проблем с файлами, расположенными в сети, они могут быть классифицированы в Зоне Интернета и, следовательно, все еще потенциальнозаблокирован.

Ознакомьтесь с этой статьей и посмотрите, разрешит ли она ее для вас: http://mikehadlow.blogspot.co.uk/2011/07/detecting-and-changing-files-internet.html

...