DLL загружается через отражение - Phantom Bug - PullRequest
1 голос
/ 09 июня 2010

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

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

Вот странная часть.

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

У меня было 2 сайта, расположенных рядом, и один работал, а другой - нет, и они были настроены точно (и я имею в виду точно) то же самое.

IISRESET никогда не помогал, но это помогло:

Я просто переместил все библиотеки DLL из каталога bin, а затем переместил их обратно.Правильно, я просто переместил их из каталога bin, затем положил обратно туда, откуда они пришли, и все работало нормально.

Есть идеи?

Есть еще информация

Когда сайт работает, я замечаю следующее: после IISRESET он все еще работает, но переработка пула приложений приведет к его поломке.

Когда сайт сломан: Neiter IISRESET или переработкапул приложений исправляет это, но перемещение одного dll, а затем обратно исправляет его.

Даже больше информации

Таким образом, получается, что IsAssignableFrom не возвращаетправильное значение.Я бы не поверил, что это правда, но мой регистратор записал результат и 2 типа, и он определенно вернул неправильное значение.Сумасшедшая вещь в том, что одна и та же dll будет возвращать разные значения в разное время при сравнении одних и тех же 2 типов.

Еще больше информации

Определенный класс, который IsAssignableFromпроисходит сбой в расположенном в файле с другими классами.Если я переместить класс в свой собственный файл, то все работает нормально.Однако, если он находится в том же файле, что и другие классы (даже если он находится в своем собственном блоке namespace), тогда ссылка Type неверна.Ссылка Type будет иметь правильное имя и методы, но она не может найти правильный конструктор.

Ответы [ 3 ]

2 голосов
/ 09 июня 2010

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

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

1 голос
/ 10 июня 2010

Возможно, что две (или более) копии одной и той же сборки загружаются в память.Лучший способ сэкономить время и головную боль - это прочно закрепить свои сборки.Если существует строгий ключ именования, для каждого домена приложения будет загружен только один экземпляр сборки.

Подробнее о контекстах привязки сборки.

0 голосов
/ 09 июня 2010

Это может быть связано с проблемой блокировки. По умолчанию все библиотеки DLL в каталоге bin загружаются ASP.Net, даже если они не используются в веб-приложении. Если вы пытаетесь загрузить типы из определенной библиотеки DLL, в то время как ASP.Net загружает эту библиотеку DLL в память, вы можете получить сообщение об ошибке из-за используемого файла. Это может выглядеть как поведение, с которым вы столкнулись, так как оно создает своего рода состояние гонки и будет отображаться как ошибка, только если определенные события происходят во время других определенных событий, даже если сайт использует только один пользователь. Это также может объяснить, почему вы не всегда получаете такое поведение.

Чтобы остановить это, вы можете поместить свои dll, из которых вы динамически загружаете типы, в каталог внутри каталога bin и загрузить их оттуда.

Чтобы быть более точным в том, в чем проблема, вам нужно будет показать нам любую ошибку, которую вы получите, когда не удается загрузить типы (поскольку она может быть совершенно не связана с проблемой блокировки).

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