Как перекомпоновать пустой DirectoryCatalog для MEF в WPF - PullRequest
2 голосов
/ 10 февраля 2012

У меня есть приложение с этим шагом:

  1. запускается приложение и ConfigureAggregateCatalog
  2. регистрируется в приложении пользователя
  3. загружает модули DLL MEF в каталог под названием «Модули»
  4. обновить каталог каталога - есть проблема

У меня есть пустой каталог 'Модули' после загрузки dll. Я пытался загрузить модули, но безуспешно.В строке произошла ошибка, когда я вызвал DirectoryCatalog.Refresh ()

System.ComponentModel.Composition.ChangeRejectedException не было обработано кодом пользователя. Message = Состав остается неизменным.Изменения были отклонены из-за следующих ошибок: Композиция вызвала множественные ошибки композиции с 14 основными причинами.Коренные причины приведены ниже.Для получения более подробной информации просмотрите свойство CompositionException.Errors.

1) Изменения в экспорте, предотвращенные нерекомментируемым импортом 'Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleInitializer..ctor (Parameter = "loadedPartCatalogs ",ContractName = "Microsoft.Practices.Prism.MefExtensions.Modularity.DownloadedPartCatalogCollection") 'для части' Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleInitializer '.

2) Изменения в экспорте, предотвращаемые нерекомендуемым импортом'Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleManager.mefFileModuleTypeLoader (ContractName = "Microsoft.Practices.Prism.MefExtensions.Modularity.MefFileModuleTypeLoader") ".*

3) Изменения в экспорте, предотвращаемые нерекомментируемым импортом 'Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleManager..ctor (Parameter = "moduleInitializer", ContractName = "Microsoft.Practices.Prism.Modularity.IModuleInitializer ")" для части "Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleManager".

4) Изменения в экспорте, предотвращаемые нерекомментируемым импортом "Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleManager.mefFileModuleTypeLoader (ContractName = "Microsoft.Practices.Prism.MefExtensions.Modularity.MefFileModuleTypeLoader") "для части" Microsoft.Practices.Prism.MefExtensions.Modularity.Mef * *нерекомментируемый импорт 'Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleManager..ctor (Parameter = "moduleInitializer", ContractName = "Microsoft.Practices.Prism.Modularity.IModuleInitializer") "в части" Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleManager '.

6) Изменения в экспорте, предотвращенные нерекомментируемым импортом' GXBilling.ViewsModels.ShellViewModel.ModuleManager (ContractName = "Microsoft.Practices.Prism.Modularity.IModuleManager))«GXBilling.ViewsModels.ShellViewModel '.

7) Найдено более одного экспорта, соответствующего ограничению' ((exportDefinition.ContractName == "Microsoft.Practices.Prism.Regions.RegionAdapterMappings") AndAlso (exportDefinition.Metadata.ContainsKey (")ExportTypeIdentity ") И также" Microsoft.Practices.Prism.Regions.RegionAdapterMappings ".Equals (exportDefinition.Metadata.get_Item (" ExportTypeIdentity ")))).

В результате: Невозможно установить импорт. Microsoft.Practices. Microsoft.Practices.Prism.MefExtensions.Regions.Behaviors.».Элемент: Microsoft.Practices.Prism.MefExtensions.Regions.Behaviors.MefDelayedRegionCreationBehavior..ctor (Parameter = "regionAdapterMappings", ContractName = "Microsoft.Practices.Prism.Regions.RegionAdapterMappings")-> Microsoft.Practices.Prism.MefExtensions.Regions.Behaviors.MefDelayedRegionCreationBehavior -> AssemblyCatalog (Assembly = "Microsoft.Practices.Prism.MefExtensions, Version = 4.0.0.0, Культура = нейтральная, PublicKeyToken = 31bf3856ad364e35 ")

8) Изменения в экспорте, предотвращенные нереакционноспособным импортом «Microsoft.Practices.Prism.MefExtensions.Regions.MefSelectorRegionAdapter..ctor (Параметр = "regionBehaviorFactory", ContractName = "Microsoft.Practices.Prism.Regions.IRegionBehaviorFactory")» на части 'Microsoft.Practices.Prism.MefExtensions.Regions.MefSelectorRegionAdapter'.

9) Изменения в экспорте, предотвращенные нереакционноспособным импортом «Microsoft.Practices.Prism.MefExtensions.Regions.MefItemsControlRegionAdapter..ctor (Параметр = "regionBehaviorFactory", ContractName = "Microsoft.Practices.Prism.Regions.IRegionBehaviorFactory")» на части 'Microsoft.Practices.Prism.MefExtensions.Regions.MefItemsControlRegionAdapter'.

10) Изменения в экспорте, предотвращенные нереакционноспособным импортом «Microsoft.Practices.Prism.MefExtensions.Regions.MefContentControlRegionAdapter..ctor (Параметр = "regionBehaviorFactory", ContractName = "Microsoft.Practices.Prism.Regions.IRegionBehaviorFactory")» на части 'Microsoft.Practices.Prism.MefExtensions.Regions.MefContentControlRegionAdapter'.

11) Обнаружено более одного экспорта, соответствующего ограничению '((exportDefinition.ContractName == "Microsoft.Practices.Prism.Regions.IRegionViewRegistry") и также (exportDefinition.Metadata.ContainsKey ("ExportTypeIdentity") AndAlso "Microsoft.Practices.Prism.Regions.IRegionViewRegistry" .equals (exportDefinition.Metadata.get_Item ( "ExportTypeIdentity")))).

Результат: невозможно установить импорт «Microsoft.Practices.Prism.MefExtensions.Regions.Behaviors.MefAutoPopulateRegionBehavior..ctor (Параметр = "regionViewRegistry", ContractName = "Microsoft.Practices.Prism.Regions.IRegionViewRegistry")» на части 'Microsoft.Practices.Prism.MefExtensions.Regions.Behaviors.MefAutoPopulateRegionBehavior. Элемент: Microsoft.Practices.Prism.MefExtensions.Regions.Behaviors.MefAutoPopulateRegionBehavior..ctor (Параметр = "regionViewRegistry", ContractName = "Microsoft.Practices.Prism.Regions.IRegionViewRegistry") -> Microsoft.Practices.Prism.MefExtensions.Regions.Behaviors.MefAutoPopulateRegionBehavior -> AssemblyCatalog (Assembly = "Microsoft.Practices.Prism.MefExtensions, Version = 4.0.0.0, Культура = нейтральная, PublicKeyToken = 31bf3856ad364e35 ")

12) Изменения в экспорте, предотвращенные нереакционноспособным импортом «Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleInitializer..ctor (параметр = "downloadedPartCatalogs", ContractName = "Microsoft.Practices.Prism.MefExtensions.Modularity.DownloadedPartCatalogCollection")» на части 'Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleInitializer'.

13) Изменения в экспорте, предотвращенные нереакционноспособным импортом «Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleManager.mefFileModuleTypeLoader (ContractName = "Microsoft.Practices.Prism.MefExtensions.Modularity.MefFileModuleTypeLoader")» на части 'Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleManager'.

14) Изменения в экспорте, предотвращенные нереакционноспособным импортом «Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleManager..ctor (Параметр = "moduleInitializer", ContractName = "Microsoft.Practices.Prism.Modularity.IModuleInitializer")» на части 'Microsoft.Practices.Prism.MefExtensions.Modularity.MefModuleManager'.

Source = System.ComponentModel.Composition StackTrace: в System.ComponentModel.Composition.CompositionResult.ThrowOnErrors (AtomicComposition atomicComposition) в System.ComponentModel.Composition.Hosting.ExportProvider.OnExportsChanging (ExportsChangeEventArgs е)в System.ComponentModel.Composition.Hosting.CatalogExportProvider.OnCatalogChanging (Object отправитель, ComposablePartCatalogChangeEventArgs e) в System.ComponentModel.Composition.Hosting.ComposablePartCatalogCollection.OnChanging (Object отправитель, ComposablePartCatalogChangeEventArgs e) в System.ComponentModel.Composition.Hosting.AggregateCatalog.OnChanging (ComposablePartCatalogChangeEventArgs е) в System.ComponentModel.Composition.Hosting.ComposablePartCatalogCollection.OnContainedCatalogChanging (Object отправитель, ComposablePartCatalogChangeEventArgs e) в System.ComponentModel.Composition.Hosting.DirectoryCatalog.OnChanging (ComposablePartCatalogChangeEventArgs е) в System.ComponentModel.Composition.Hosting.DirectoryCatalog.Refresh () в GXBilling.Bootstrapper.RefreshCatalog () в E: \ Projects! New! \ GXBilling \ GXBilling \ Bootstrapper.cs: строка 36 в GXBilling.ViewsModels.WinLogOnViewModel.FWCore_OnDownloadedModulesCompleted (Object отправитель, EventArgs e) в E: \ Проекты Новый \ GXBilling \ GXBilling \ ViewsModels \ WinLogOnViewModel.cs: линия 168 в BillingCore.FWCore.FWCore_ModuleDownloadedCompleted (Отправитель объекта, ModuleDownloadedEventArgs e) в E: \ Projects! New! \ GXBilling \ BillingCore \ FWCore.cs: строка 169 в BillingCore.FWCore.client_DownloadFileCompleted (Отправитель объекта, DownloadFileCompletedEventArgs e) в E: \ Projects! New! \ GXBilling \ BillingCore \ FWCore.cs: строка 207 в BillingCore.BillingServiceRef.FileTransferServiceClient.OnDownloadFileCompleted (Object состояние) в E: \ Проекты! Новый! \ GXBilling \ BillingCore \ Сервис References \ BillingServiceRef \ Reference.cs: строка 739 в System.Windows.Threading.ExceptionWrapper.InternalRealCall (Делегат обратный вызов, объектные аргументы, Int32 (numArgs) в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (Object источник, метод делегата, аргументы объекта, int32 numArgs, делегат catchHandler) в System.Windows.Threading.DispatcherOperation.InvokeImpl () в System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext (Object государство) в System.Threading.ExecutionContext.runTryCode (объект userData) в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (TryCode код, CleanupCode backoutCode, Object userData) в System.Threading.ExecutionContext.RunInternal (ExecutionContext выполнениеContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое значение ignoreSyncCtx) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Windows.Threading.DispatcherOperation.Invoke () в System.Windows.Threading.Dispatcher.ProcessQueue () в System.Windows.Threading.Dispatcher.WndProcHook (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & handled) в MS.Win32.HwndWrapper.WndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & handled) в MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object o) в System.Windows.Threading.ExceptionWrapper.InternalRealCall (Делегат обратный вызов, объектные аргументы, Int32 (numArgs) в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (Object источник, метод делегата, аргументы объекта, int32 numArgs, делегат catchHandler) в System.Windows.Threading.Dispatcher.InvokeImpl (DispatcherPriority приоритет, время ожидания TimeSpan, метод делегата, аргументы объекта, Int32 numArgs) в MS.Win32.HwndSubclass.SubclassWndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) в MS.Win32. UnsafeNativeMethods.DispatchMessage (MSG & msg) в System.Windows.Threading.Dispatcher.PushFrameImpl (DispatcherFrame Рамка) в System.Windows.Threading.Dispatcher.PushFrame (фрейм DispatcherFrame)в System.Windows.Window.ShowHelper (Object booleanBox) в System.Windows.Window.Show () в System.Windows.Window.ShowDialog () InnerException:

Есть части кода, отмеченныеИмпорт атрибута:

[Import]
public ShellViewModel ViewModel

[Import(AllowRecomposition = false)]
public IModuleManager ModuleManager { get; set; }

[Import(typeof(IShell), AllowRecomposition = true)]
public IShell MainShell { get; set; }

[ImportingConstructor]
public ModuleImporting(IRegionManager regionManager)

Вот и все.У меня нет IEnureable или IList или т. Д. В коде.Так в чем же проблема?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Обновление DirectoryCatalog запускает перекомпоновку . Импорт части MEF может быть перекомпонован только в том случае, если он явно помечен как таковой, например, так:

[ImportMany(typeof(IFoo),AllowRecomposition=true)]
IEnumerable<IFoo> Foos { private get; set; }

Если перекомпоновка влияет на импорт, но не помечена AllowRecomposition=true, вы получите сообщение об ошибке: «Изменения в экспорте предотвращены нерекомпозиционным импортом».

Кроме того, импорт через конструктор вообще не поддерживает перекомпоновку. Тем не менее, вы можете обойти это .

0 голосов
/ 11 мая 2014

Всякий раз, когда возникает ошибка, например:

"Ошибка активации при попытке получить экземпляр типа, ключ" ""

Затем проверьте, [Export]атрибут указан в <User Control page>, который мы собираемся внедрить в Region.

Это небольшая вещь, но она может потратить часы на отладку!

Спасибо!Басси

...