DLL необходимо загрузить дважды, чтобы изменения вступили в силу

У меня есть веб-приложение .NET 1.1, работающее на локальном компьютере для разработки, а рабочая версия работает на размещенном веб-сервере с .NET 2.0 (все работает нормально).

На моем реальном сервере есть зеркало проекта, который находится на моей локальной машине разработки. Когда я пересобираю проект/решение и загружаю новую DLL на работающий сервер, сделанные мной изменения никогда не вступают в силу при первой загрузке.

я считаю, что я должен

  1. Создайте проект на компьютере разработчика
  2. Перейдите на домашнюю страницу на компьютере разработчика, чтобы DLL перекомпилировалась
  3. Загрузить новую DLL на работающий сервер
  4. Перейдите на домашнюю страницу работающего сервера, чтобы DLL перекомпилировалась

затем повторите шаги 2,3 и 4 снова, и на этот раз изменения вступили в силу.

Любые идеи, почему это происходит, поскольку это делает мой процесс развертывания намного длиннее, чем должен быть, и это очень расстраивает, иногда мне даже приходится делать это три раза!

Помощь очень ценится.

Примечание. Я запускаю Studio .NET 2003 на компьютере с Windows XP2 и просматриваю Firefox 3.0.9.


person Kevin Dark    schedule 24.04.2009    source источник
comment
Вы уверены, что имеете в виду, что ваша локальная копия — v1.1, а удаленная версия — v2.0?   -  person Wayne    schedule 24.04.2009
comment
Ага! Вот в этом дело. Только потому, что приложение было разработано пару лет назад в 1.1 и никогда не обновлялось до 2.0. К счастью, запуск проекта 1.1 на сервере с 2.0 до сих пор не сломал его.   -  person Kevin Dark    schedule 24.04.2009


Ответы (3)


Если у вас есть возможности удаленного рабочего стола, вы можете попробовать выполнить шаги 1–4 и перезапустить пул приложений и посмотреть, решит ли это проблему.

person Wayne    schedule 24.04.2009
comment
Спасибо, я попробую это в следующий раз, когда загружу. - person Kevin Dark; 24.04.2009
comment
Это, казалось, сработало. Я предполагаю, что поскольку в рабочем процессе есть несколько потоков, старая DLL все еще находилась в памяти. Чтобы получить немедленный результат, повторите или обновите пул приложений для этого веб-сайта, чтобы изменения вступили в силу. Спасибо :) - person Kevin Dark; 24.04.2009

Хотя я не понимаю, почему скомпилированная DLL будет "перекомпилирована" ASP.NET (она должна быть просто загружена), вот некоторые возможности для рассмотрения (я добавлю больше, когда подумаю об этом):

  1. Кэширование вашим браузером. В Firefox вы можете отключить кеширование, если у вас есть «дополнение для веб-разработчиков».

  2. Поврежденные теневые копии библиотеки DLL в папке временных файлов ASP.NET. Чтобы решить эту проблему, см. мой ответ на этот вопрос.

person Cerebrus    schedule 24.04.2009
comment
Спасибо за ответ. Когда я говорю перекомпилировать, я имею в виду время, необходимое приложению для загрузки при первом запуске после компиляции. Это большая DLL (около 2 МБ), и при первом запуске после компиляции загрузка занимает около 30-40 секунд, после чего страницы загружаются с нормальной скоростью. 1. Я не думаю, что это кеширование, так как изменения немедленно вступают в силу на моем сервере разработки, на который я перехожу через localhost и т. д. Это только когда DLL копируется на рабочий сервер, это почти так, как будто новая DLL никогда не загружалась в первый раз. - person Kevin Dark; 24.04.2009
comment
2. Я никак не могу остановить IIS на рабочем сервере, чтобы загрузить изменения, а затем перезапустить его. Изменения вносятся в течение рабочего дня и у меня не может быть НИКАКОГО простоя. - person Kevin Dark; 24.04.2009

Проверьте счетчики производительности для перекомпиляции. Если вы не NGEN, удаление новой DLL на веб-сайте приводит к перекомпиляции страниц. В web.config есть параметр, который указывает, компилируются ли они в пакетном режиме или по одному. В любом случае удаление новой библиотеки DLL должно вызвать повторную компиляцию ваших страниц.

Вот что меня не раз кусало - вношу изменение, бросаю и попадаю на сайт. Я не вижу последствий моего изменения, поэтому я делаю что-то еще, чтобы «исправить это», а затем обновляю окно браузера. ТЕПЕРЬ я вижу изменения! Изменение было там все время, это было обновление, которое «вызвало» его появление.

person n8wrl    schedule 24.04.2009
comment
Спасибо за ответ. Страницы проектов настроены на перекомпиляцию новой DLL, что идеально подходит для меня. Но даже при обновлении страницы, даже при нажатой клавише CTRL, никакие изменения не вступят в силу, пока я не повторю шаги 2, 3 и 4. - person Kevin Dark; 24.04.2009