Имя: Пароль:
1C
 
Как выгрузить dll COM компоненты из памяти процесса?
0 TormozIT
 
гуру
15.10.16
09:32
Чтобы проверить актуальность версии COM-компоненты я создаю ее объект
Новый COMОбъект(КлассКомпоненты)
Далее проверяю нужное свойство или метод и в зависимости от успешности хочу перезаписать файл dll актуальной версией из макета. Но файл остается заблокированным, т.к. удерживается текущим процессом 1С. Как его освободить?
1 MrStomak
 
15.10.16
10:05
(0) Да вроде как оно удерживается, пока, процесс 1С есть.
2 MrStomak
 
15.10.16
10:13
Я бы пробовал через загрузку ВК addin_v2.dll
3 TormozIT
 
гуру
15.10.16
10:14
(2) Непонятно.
4 MrStomak
 
15.10.16
10:18
(3) отдельную dll грузить с новой версией.
5 TormozIT
 
гуру
15.10.16
10:18
(4) Не помогает. Сопоставление ProgID и dll тоже запоминается видимо.
6 MrStomak
 
15.10.16
10:22
(5) Когда делаешь ЗагрузитьВнешнююКомпоненту, в реестре в записи для этой компоненты inprocserver не обновляется на новый файл?
7 TormozIT
 
гуру
15.10.16
10:24
(6) Я не делаю ЗагрузитьВнешнююКомпоненту. Я делаю Новый COMОбъект(КлассКомпоненты)
8 MrStomak
 
15.10.16
10:29
(7) ну тогда regsvr32, после чего пересоздавать?..
9 TormozIT
 
гуру
15.10.16
10:30
Именно так и делаю.
10 TormozIT
 
гуру
15.10.16
10:31
Процесс 1С все запоминает (ProgID-ИмяФайла-Файл) до конца жизни.
11 MrStomak
 
15.10.16
10:38
При этом старая версия всё время держится в памяти?

1С утверждает, что освобождает память, когда счетчик ссылок до 0 доходит.
Но прямо не говорится, в какой момент это происходит.
Мне кажется, что при окончании вызова функции/процедуры и при исчезновении контекста.

Если ты присваиваешь переменной значение com в обработке, потом закрываешь её и заново открываешь - всё равно происходит  удержание старого файла?

Наверное, этот вопрос на партнерке надо задавать, в документации ничего нет.
12 Loky9
 
15.10.16
11:47
(0) Можно загрузить в какой-нибудь другой процесс, или не загружать вообще никуда.
13 TormozIT
 
гуру
15.10.16
12:32
(12) Меделенно очень будет. Много обращений к COM объекту.
14 Mauser
 
15.10.16
12:50
Называй файлы с учетом версии?
15 Torquader
 
15.10.16
14:25
Вы создаёте COM-объект из Dll - он подключается к текущему процессу. Для выгрузки Dll все ссылки на её объекты должны отсутствовать.
После этого, система вызывает функцию DllCanUnloadNow, на которую Dll должна ответить разрешением, если допускает выгрузку - вполне вероятно, что внешние компоненты 1С, так как их выгрузка не планируется, просто не разрешают себя выгружать и всегда отвечают S_FALSE.
Если уж очень хочется, то можно запустить другой процесс, скажем сценарий на VbScript, в котором создать компоненту, проверить её версию и записать результат в файл - после завершения сценария Dll точно освободится.
16 Torquader
 
15.10.16
14:38
Ну и, по нормальному - нужно заполнять VirsionInfo, чтобы можно было проверить версию без необходимости чего-то создавать.
17 oleg_km
 
15.10.16
15:11
Сергей Смирнов, который популяризует дотНЕТ в 1С вроде приводил код по выгрузке модулей
18 Torquader
 
15.10.16
16:07
(17) Собственно, делаешь LoadLibrary указанного файла - получаешь идентификатор HMODULE, а потом делаешь FreeLibrary пока не вызовется ошибка - но очень большая вероятность, что процесс "попросят" из памяти.
19 oleg_km
 
15.10.16
17:34
(18) Вобщем-то да, только для КОМ LoadLibrary делает подсистема КОМ
20 TormozIT
 
гуру
15.10.16
18:11
(14) ProgID то один. Не создавать же на каждую версию новый ProgID.
21 TormozIT
 
гуру
15.10.16
18:13
(14) Файл переименовывать пробовал конечно же. Он начинает использоваться (соответствие ProgID-ИмяФайла) только после перезапуска процесса.
22 xaozai
 
15.10.16
18:16
ОбъектВК = Неопределено;
23 TormozIT
 
гуру
15.10.16
18:21
(22) Слишком просто =)
24 Serginio1
 
15.10.16
19:30
На .Net не выгружаются.
25 Serginio1
 
15.10.16
19:30
Хотя могу и ошибаться.
26 TormozIT
 
гуру
15.10.16
21:07
У меня COM компонента на .Net
Но и с обычными COM компонентами такая же история. Процесс менеджер показывает, что все dll висят в памяти не смотря на отсутствие в памяти объектов, опирающихся на них.
27 Serginio1
 
16.10.16
00:40
http://stackoverflow.com/questions/392786/unload-com-dll-from-net-program

То есть нужно создавать отдельно Домен в него загружать сборки в нем создавать объекты, а затем этот домен выгружать.
28 Serginio1
 
16.10.16
01:15