Динамически загруженные сборки - MVC и WCF действуют по-разному - PullRequest
0 голосов
/ 12 ноября 2018

Я динамически загружаю сборки из таблицы базы данных с именами сборок, которые вставляют правила в механизм правил. Идея в том, что мы можем расширять функциональность, разрабатывая новые правила без необходимости перекомпиляции и развертывания всего пакета.

Есть веб-приложение MVC и настольное приложение WCF, которые разделяют большую часть кода, включая класс RulesRunner, который я описываю здесь.

Этот код находится в конструкторе класса RulesRunner

        rules = rulesEngineRepository.GetRules(x => x.Enabled);
        foreach (var rule in rules)
        {
            var ruleAssembly = Assembly.LoadFrom($"{rule.AssemblyName}.dll");
            var installerType = ruleAssembly.GetType("RulesEngine.Rules.RulesInstaller");
            var installer = Activator.CreateInstance(installerType) as IWindsorInstaller;
            container.Install(installer);
        }

Класс RulesRunner не загружается динамически, он компилируется как обычная ссылка в коде MVC и WCF.

В случае WCF все это работает точно так, как задумано. Сборка загружается, создается экземпляр, и когда механизм правил запускается где-то еще, он отлично использует загруженные таким образом правила.

В веб-приложении MVC этот код возвращает значение NULL из строки Activator.CreateInstance и, таким образом, завершается ошибкой при вызове. Я не могу на всю жизнь понять, что здесь происходит иначе.

Если я проверяю переменные после вызова контейнера. Установщик (установщик), я вижу отчеты установщика переменных «Установщик» вызвал исключение типа «System.IO.FileNotFoundException».

Но, но, но ... но тип installerType содержит всю правильную информацию и значение. Как будто он обнаружил, что DLL выполняет LoadFrom, но не может найти ее снова, когда пытается создать еще две строки кода.

1 Ответ

0 голосов
/ 13 ноября 2018

Исправить это было довольно просто:

var ruleAssembly = Assembly.LoadFrom(rule.AssemblyName");

Переключение с LoadFrom () на Load () - все, что нужно. Я считаю, что это связано с контекстом, в который загружается сборка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...