08.09.2006, 13:43 | #1 |
Участник
|
Как удалить COM объект?
Здравствуйте.
Такой вопрос: создал COM сервер (dll) на фоксе. Работаю в аксапте с ним таким образом: COM gladelib ; ; gladelib = new COM("gladelib.Application"); ret = gladelib.SetReserve(); gladelib.detach(); Работает все замечательно, но когда мне приходится перекомпилить dll , возникает ошибка: "File access is denied D:\Project\GladeLib\GladeLib.dll" Приходится выходить из аксапты, что не очень удобно.. Как же мне все-таки "отпустить" dll ? |
|
08.09.2006, 13:49 | #2 |
Участник
|
Попробуйте COM.finalize()
|
|
08.09.2006, 13:56 | #3 |
Участник
|
Цитата:
Сообщение от Lucky13
Попробуйте COM.finalize()
|
|
08.09.2006, 14:18 | #4 |
Microsoft Dynamics
|
А зачем вы вызываете gladelib.detach() ? После этого COM-объект пускается в "свободное плавание" и освободить ссылку на объект через gladelib.finalize() Вы уже не сможете.
__________________
You should use Bing before asking dumb questions. |
|
11.09.2006, 12:57 | #5 |
Участник
|
|
|
11.09.2006, 14:46 | #6 |
Участник
|
Странно, а если явно присвоить Null после Finalize?
|
|
11.09.2006, 15:43 | #7 |
Пенсионер
|
Может внутри объекта есть вызовы внутренние и они каким-то образом блокируют dll-ку, тогда аксапта здесь нипричем...
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|
11.09.2006, 16:11 | #8 |
Microsoft Dynamics
|
Скорее всего внутри COM-сервера остались неосвобожденные объекты, в этом случае исполняющая система COM (SCM) не может выгрузить COM-сервер из памяти...
__________________
You should use Bing before asking dumb questions. |
|
11.09.2006, 16:11 | #9 |
Участник
|
Такое впечатление, что в Axapta'е это сделано специально.
Т.е. при первом создании COM-объекта происходит загрузка dll в память процесса. При этом в таблицу ссылок на открытые модули добавляется вновь созданный. При удалении экземпляра класса COM-объекта эта dll не освобождается, а ссылка на нее остается в памяти. При последующей попытке вызова этой dll просто используется уже загруженный модуль. Можно принудительно удалить из памяти dll, но при последующей попытке ее загрузить Axapta упадет
__________________
Axapta v.3.0 sp5 kr2 |
|