Новые классы, добавленные в сборку, не обнаруживаются путем отражения - PullRequest
3 голосов
/ 22 февраля 2011

У нас есть система обработки правил, в которой каждое правило представлено классом, а все правила реализуют общий интерфейс.Иногда мы добавляем правило (класс) в сборку, но когда это правило подходит для обработки, система не может найти этот класс.Код, который мы используем для запуска правил, выглядит следующим образом.

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 на наших машинах разработки.applciation - это веб-сервис, и для его отладки мы должны запустить модульные тесты, подключиться к процессу aspnet_wp.exe и затем установить точки останова.Причина, по которой он не смог найти классы, заключалась в том, что машина указала на экземпляр QA веб-службы, поэтому никакие новые классы не были бы найдены;все старые были там, потому что они были развернуты в отдел QA.Спасибо за все комментарии и, в конечном итоге, привело меня к нужным местам для поиска, в конечном итоге все было связано с развернутым местоположением, но не так, как вы думаете.:)

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Если эта проблема не устраняется после перезагрузки, у вас есть 1 из 3 возможных проблем.

  1. На самом деле вы ее не развертываете.

  2. Ваше приложение использует некоторый тип механизма кэширования пользовательских сборок и не обновляется, если не увидеть новую сборку в папке подбора.

  3. Вы развертываете ее, но не направильное местоположение / сервер.


Если бы я сделал ставку, я бы увидел, что было за дверью # 3.


ОБНОВЛЕНИЕ
Основываясь на комментариях: я не знал, что вы запускаете это локально, а не развертываете на сервере.

При этом похоже, что вы ссылаетесь на сборку по имени сборкивместо ссылки на уровне проекта.VS кэширует сборки во время разработки и, вероятно, не обновляет ваш локальный кеш.

Кроме того, в зависимости от типа проекта иногда возникает путаница относительно того, где на самом деле находится сборка.Например, в проектах веб-сайтов VS с радостью (и, как правило, неправильно) перенаправит ваши ссылки на сборки, если найдет копию сборки в GAC или по какому-либо другому пути.Проекты веб-приложений обычно не демонстрируют такого поведения.

В основном проекте щелкните правой кнопкой мыши ссылку на сборку и посмотрите, откуда, по его мнению, загружается dll.

1 голос
/ 22 февраля 2011

Если я вас правильно понимаю, и сборка может быть заменена во время выполнения, у вас возникнет проблема Assembly.LoadFrom, которая вернет ту же сборку, если ее идентификатор совпадает, даже если вы укажетедругой путь.

Попробуйте вместо этого использовать LoadFile.См. Объяснение выбора контекста привязки здесь .

Однако сначала вы должны убедиться, что сборка действительно изменилась .Поместите точку останова в этот метод, и когда он попадет, откройте файл, расположенный в dllPath в Reflector (пока он еще свободен :-), и убедитесь, что вы действительно пытаетесь загрузить новую сборку.

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

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