none
Как освободить библиотеку при завершении процесса? RRS feed

  • Вопрос

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

    Итак, есть солюшн. В проблеме участвуют 3 проекта:

    • Клиент - компилируется в client.exe

    • Стартер - компилируется в starter.exe

    • Конфиг - компилируется в config.dll

    Я запускаю client.exe. При запуске без параметров он запускает процесс starter.exe и сам завершается. В стартере открывается форма с выбором сервера и двумя кнопочками: "Настройки" и "Подключиьтся". Когда я жму Подключиться, происходит подключение к выбранному серверу, с которого сначала получаются обновленные файлы (в тч client.exe иconfig.dll), затем запускается client.exe и стартер вырубается. Так должно быть. НО...

    Обновление не проходит. При обновлении он не может заменить библиотеку config.dll, потому что она занята. Проверяю процесс эксплоером. А занята она оказывается процессомstarter.exe! Почему? У него нет в референсах ни клиента ни конфига, так что он не должен ее цеплять. Это какая то магия, помогите!

    13 ноября 2015 г. 5:44

Ответы

  • 1. Проверьте, нет ли у вас из Starter референсов на другие проекты, которые использую конфиг.

    2. Прямо поиском поищите в стартере Load, может вы не правы насчет рефлекшена?

    3. Сбилдите проект, удалите руками Config и запустите стартер из студии, посмотрите где упадет.

    • Помечено в качестве ответа iRumba 13 ноября 2015 г. 9:36
    13 ноября 2015 г. 8:02
    Отвечающий

Все ответы

  • Добрый день.

    Есть несколько способов решения вашей проблемы:

    1. Занятые библиотеки можно переименовывать. Переименуйте в config.dll.bak и спокойно качайте новую версию. При запуске Clietn или Starter версии файлов с .bak подчищаете.

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

    13 ноября 2015 г. 6:05
    Отвечающий
  • Решение неплохое, но проблема в том, что обновлением рулю не я. То есть я не могу ничего менять в логике обновления.
    13 ноября 2015 г. 6:25
  • Тогда ваш выбор теневое копирование.
    13 ноября 2015 г. 6:40
    Отвечающий
  • Нет. Мой выбор - узнать, почему занята библиотека. Я не могу внедрять теневое копирование в проект, это не в моих полномочиях. Тем более раньше такой проблемы не было. Она появилась, после того как в библиотеке Config я заменил форму с WinForm на WPF
    • Изменено iRumba 13 ноября 2015 г. 7:02
    13 ноября 2015 г. 6:59
  • Если у вас есть исходники Starter.exe проверьте, что эта библиотека не грузится через reflection. В этом случае ссылок на нее нет, а зависимость есть.
    13 ноября 2015 г. 7:21
    Отвечающий
  • Нет, через рефлекции тоже не цепляется
    13 ноября 2015 г. 7:29
  • Попробуйте перед запуском Client (или Starter, если с Client не получится) удалить Config.dll. Точно все будет корректно работать?
    13 ноября 2015 г. 7:36
    Отвечающий
  • Конечно не будет. Client использует Config.
    13 ноября 2015 г. 7:41
  • Ок, тогда запускайте вручную Starter удалив Config
    13 ноября 2015 г. 7:41
    Отвечающий
  • УЖАС! Стартер без конфига тоже не запускается!
    13 ноября 2015 г. 7:48
  • Я чуть выше вам писал про теневое копирование ))
    13 ноября 2015 г. 7:49
    Отвечающий
  • Да тут не в копировании дело! Стартер не должен цеплять вообще ничего! Это самостоятельное приложение. Все его взаимодействие с другими проектами сводится к запуску процесса. 
    13 ноября 2015 г. 7:51
  • Как такое возможно? Стартер не цепляет конфиг через референсы, не цепляет через рефлексии, но каким то образом библиотеку подгружает. Каким, интересно?
    13 ноября 2015 г. 7:57
  • 1. Проверьте, нет ли у вас из Starter референсов на другие проекты, которые использую конфиг.

    2. Прямо поиском поищите в стартере Load, может вы не правы насчет рефлекшена?

    3. Сбилдите проект, удалите руками Config и запустите стартер из студии, посмотрите где упадет.

    • Помечено в качестве ответа iRumba 13 ноября 2015 г. 9:36
    13 ноября 2015 г. 8:02
    Отвечающий
  • Нашел. В стартере в новой WPF формочке был подключен ResourceDictionary из конфига. Строка была подчеркнута, типа он не знает где искать данный файл, потому что конфига не было в референсах, но тем не менее во время выполнения он его находил. Короче дело было не в бабине.

    Может, есть способы, как отлавливать такие вот ссылки в xaml? А то путаница получается.


    • Изменено iRumba 13 ноября 2015 г. 8:46
    13 ноября 2015 г. 8:45
  • Смотреть не только ошибки на и варнинги, при обнаружении таких проблем искать поиском по проекту упоминание библиотеки.
    13 ноября 2015 г. 8:56
    Отвечающий