У нас есть система обработки правил, где каждое правило представлено классом, а все правила реализуют общий интерфейс. Иногда мы добавляем правило (класс) в сборку, но когда это правило появляется для обработки, система не может найти этот класс. Код, который мы используем для запуска правил, выглядит следующим образом.Новые классы, добавленные в сборку, не найдены через отражение
private void runClass(string dllName, string className, string methodName, string ruleNamespace)
{
Assembly _Assemblies = Assembly.LoadFrom(dllName);
Type _Type = null;
string nameSpace = _Assemblies.ManifestModule.Name.Substring(0, _Assemblies.ManifestModule.Name.ToLower().IndexOf(".dll"));
if (ruleNamespace.Trim() != "")
nameSpace = nameSpace + "." + ruleNamespace;
_Type = _Assemblies.GetType(nameSpace + "." + className);
if (_Type == null)
throw new Exception("Cannot find class " + className + " in " + nameSpace + ".");
IRule rule = (IRule)Activator.CreateInstance(_Type);
rule.Process();
}
Я попытался очистки сборки, восстановление с нуля, перезагрузки, вытирая DLL файлы вручную и воссоздании и несколько других вещей, которые я не могу вспомнить сейчас. Причудливая часть состоит в том, что в сборке может быть 50 правил, и 48 из них найдены, но два не являются, а два, которые не найдены, - это те, которые были только что добавлены. Может ли кто-нибудь подумать о том, что может вызвать это?
Обновление: я нашел фактический ответ и принял самый близкий к фактическому ответу, потому что он привел меня в правильном направлении. У нас есть две ветви кода: одна для dev и одна для QA на наших машинах dev. приложение является веб-службой и для его отладки, мы должны начать модульные тесты, подключиться к процессу aspnet_wp.exe, а затем установить точки останова. Причина, по которой он не мог найти классы, состоял в том, что машина указала на экземпляр QA веб-службы, поэтому любые новые классы не будут найдены; все старые были там, потому что они были развернуты в филиале ОК. Спасибо за все комментарии и, в конце концов, приведу меня в нужные места, в конечном итоге все это касается развернутого места, но не так, как вы думаете. :)
Возможно, вы используете старый код. – Gabe
Извините, что вы не относитесь к делу, но я думаю, что ваш код трудно читать, потому что вы используете очень странную '_Convention' для локальных переменных. Почему бы не назвать их 'thisWay', как это обычно делается на C#? –
Что именно вы имеете в виду, говоря: «Иногда мы добавим правило (класс) в сборку»? Я полагаю, вы не имеете в виду добавить его во время выполнения и переписать сборку? Это не ясно. –