Как выгрузить dll COM компоненты из памяти процесса? #782946


#0 by TormozIT
Чтобы проверить актуальность версии COM-компоненты я создаю ее объект Новый COMОбъект(КлассКомпоненты) Далее проверяю нужное свойство или метод и в зависимости от успешности хочу перезаписать файл dll актуальной версией из макета. Но файл остается заблокированным, т.к. удерживается текущим процессом 1С. Как его освободить?
#1 by MrStomak
Да вроде как оно удерживается, пока, процесс 1С есть.
#2 by MrStomak
Я бы пробовал через загрузку ВК addin_v2.dll
#3 by TormozIT
Непонятно.
#4 by MrStomak
отдельную dll грузить с новой версией.
#5 by TormozIT
Не помогает. Сопоставление ProgID и dll тоже запоминается видимо.
#6 by MrStomak
Когда делаешь ЗагрузитьВнешнююКомпоненту, в реестре в записи для этой компоненты inprocserver не обновляется на новый файл?
#7 by TormozIT
Я не делаю ЗагрузитьВнешнююКомпоненту. Я делаю Новый COMОбъект(КлассКомпоненты)
#8 by MrStomak
ну тогда regsvr32, после чего пересоздавать?..
#9 by TormozIT
Именно так и делаю.
#10 by TormozIT
Процесс 1С все запоминает (ProgID-ИмяФайла-Файл) до конца жизни.
#11 by MrStomak
При этом старая версия всё время держится в памяти? 1С утверждает, что освобождает память, когда счетчик ссылок до 0 доходит. Но прямо не говорится, в какой момент это происходит. Мне кажется, что при окончании вызова функции/процедуры и при исчезновении контекста. Если ты присваиваешь переменной значение com в обработке, потом закрываешь её и заново открываешь - всё равно происходит  удержание старого файла? Наверное, этот вопрос на партнерке надо задавать, в документации ничего нет.
#12 by Loky9
Можно загрузить в какой-нибудь другой процесс, или не загружать вообще никуда.
#13 by TormozIT
Меделенно очень будет. Много обращений к COM объекту.
#14 by Mauser
Называй файлы с учетом версии?
#15 by Torquader
Вы создаёте COM-объект из Dll - он подключается к текущему процессу. Для выгрузки Dll все ссылки на её объекты должны отсутствовать. После этого, система вызывает функцию DllCanUnloadNow, на которую Dll должна ответить разрешением, если допускает выгрузку - вполне вероятно, что внешние компоненты 1С, так как их выгрузка не планируется, просто не разрешают себя выгружать и всегда отвечают S_FALSE. Если уж очень хочется, то можно запустить другой процесс, скажем сценарий на VbScript, в котором создать компоненту, проверить её версию и записать результат в файл - после завершения сценария Dll точно освободится.
#16 by Torquader
Ну и, по нормальному - нужно заполнять VirsionInfo, чтобы можно было проверить версию без необходимости чего-то создавать.
#17 by oleg_km
Сергей Смирнов, который популяризует дотНЕТ в 1С вроде приводил код по выгрузке модулей
#18 by Torquader
Собственно, делаешь LoadLibrary указанного файла - получаешь идентификатор HMODULE, а потом делаешь FreeLibrary пока не вызовется ошибка - но очень большая вероятность, что процесс "попросят" из памяти.
#19 by oleg_km
Вобщем-то да, только для КОМ LoadLibrary делает подсистема КОМ
#20 by TormozIT
ProgID то один. Не создавать же на каждую версию новый ProgID.
#21 by TormozIT
Файл переименовывать пробовал конечно же. Он начинает использоваться (соответствие ProgID-ИмяФайла) только после перезапуска процесса.
#22 by xaozai
ОбъектВК = Неопределено;
#23 by TormozIT
Слишком просто =)
#24 by Serginio1
На .Net не выгружаются.
#25 by Serginio1
Хотя могу и ошибаться.
#26 by TormozIT
У меня COM компонента на .Net Но и с обычными COM компонентами такая же история. Процесс менеджер показывает, что все dll висят в памяти не смотря на отсутствие в памяти объектов, опирающихся на них.
#27 by Serginio1
То есть нужно создавать отдельно Домен в него загружать сборки в нем создавать объекты, а затем этот домен выгружать.
#28 by Serginio1
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С