Вход | Регистрация



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

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

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует