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