2014-01-13 1 views
0

Мы разрабатываем графический интерфейс графического интерфейса пользователя с использованием Catel.MVVM. Отдельные плагины должны загружаться динамически, используя атрибут «ServiceLocatorRegistration».Атрибуты автокаталога Catel с несколькими экземплярами

Пример:

[ServiceLocatorRegistration(typeof(IInitializable), ServiceLocatorRegistrationMode.SingletonInstantiateWhenRequired, "SamplePlugin")]

В нашем загрузчике мы загружаем все Plugin сборки в AppDomain по умолчанию:

 Catel.Windows.Controls.MVVMProviders.Logic.UserControlLogic.DefaultSkipSearchingForInfoBarMessageControlValue = true; 
     Catel.Windows.Controls.MVVMProviders.Logic.UserControlLogic.DefaultCreateWarningAndErrorValidatorForViewModelValue = false; 

     IoCConfiguration.DefaultServiceLocator.AutoRegisterTypesViaAttributes = true; 
     IoCConfiguration.DefaultServiceLocator.CanResolveNonAbstractTypesWithoutRegistration = true; 

     foreach (
     var file in 
      BaseDirectory.GetFiles("*.dll", SearchOption.AllDirectories) 
      .Where(f => IsNetAssembly(f.FullName)) 
      .Where(f => !f.FullName.EndsWith("resources.dll")) 
      .AsParallel()) 
     { 
     try 
     { 
      var asm = Assembly.ReflectionOnlyLoadFrom(file.FullName); 
     } 
     catch { } 
     }

Затем мы пытаемся инициализировать их по телефону

var initializables = ServiceLocator.Default.ResolveTypes(); 
foreach(var initializable in initializables) 
    initializable.Initialize(); 

Но даже если у нас есть сборки плагинов, загруженные в AppDomain, мы не получаем все классы с помощью ServiceLocatorRegistration на дань.

Должно ли быть разрешено все классы, у которых есть атрибут примера, как указано выше? Спасибо заранее!

ответ

0

Проблема, вероятно, связана с тем, что сборки, содержащие типы, которые используют регистрацию, еще не загружены в AppDomain. Есть несколько вещей, которые вы можете рассмотреть следующие вопросы:

1) Используйте AppDomainExtensions.PreloadAssemblies

2) Используйте тип как-то (как Console.WriteLine (TypeOf (TypeFromAssembly) .FullName))

Я бы не рекомендовал второй, потому что он идет против вашей архитектуры подключаемого модуля.

+0

Я попробую сделать это как можно скорее (1-й), но, как я написал, мы уже загружаем сборки в стандартную AppDomain. Я добавил соответствующий код в мой вопрос выше. Может быть, проблема в том, что мы загружаем сборки «ReflectionOnly»? – chrisih

1

Решил эту проблему самостоятельно. Ошибка была, вероятно, в линии

var asm = Assembly.ReflectionOnlyLoadFrom(file.FullName);
После замены этой строки
AppDomain.CurrentDomain.LoadAssemblyIntoAppDomain(file.FullName);
все работает так, как ожидалось. Спасибо Geert за то, что вы указали в правильном направлении!