|
Как выгрузить 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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |