Я динамически загружаю сборки из таблицы базы данных с именами сборок, которые вставляют правила в механизм правил. Идея в том, что мы можем расширять функциональность, разрабатывая новые правила без необходимости перекомпиляции и развертывания всего пакета.
Есть веб-приложение 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, но не может найти ее снова, когда пытается создать еще две строки кода.