06.04.2012, 14:06 | #1 |
Участник
|
Загруженая dll на C# не выгружается
Есть dll написанная разработчиком оборудования. Эта dll содержит функции управления этим оборудованием. Сделана другая dll на c#, которая использует функции первой dll и представляет интерфейс в виде класса в Х++. Общая логика работы классическая: открытие устройства, вывод в устройство, закрытие устройства. Первый запуск из под axapta - все хорошо. Запуск производился из job. Второй запуск этого job вызывает ошибку - попытка обращения к защищенной памяти. Путем экспериментов, удалось выяснить, что при закрытии устройства очищаются данные и освобождает память в dll сделанной разработчиком оборудования, т.е. после закрытия, dll должна быть освобождена (freelibrary) и для повторного использования должна быть загружена еще раз. Казалось, что логика работы в Axapta будет следующая, job или форма обращаются к C# dll, выполняют необходимые действия и по окончании их вызывают закрытие устройства, завершаются сами (казалось и должны освободить C# dll). Но это не так, dll освобождается только после завершения сеанса Axapta. Попытка выполнить данные действия в отдельном thread не помогла, dll осталась загруженной после завершения thread. Есть ли способ освобождать dll после использования?
|
|
06.04.2012, 15:36 | #2 |
Участник
|
Слишком сумбурно описано. Не понятно где проблема, то ли в аксапте, то ли в .net обертке, то ли в dll производителя устройства.
Чтобы это выяснить, попробуйте сделать приложение-клиент на C# и в нем использовать .net обертку. Мое предположение - прокси класс в сборке C# неправильно реализует интефейс IDisposable, либо не вызывается метод Dispose в классе-обертке.
__________________
Sapere aude |
|
09.04.2012, 07:56 | #3 |
Участник
|
Проблема именно с axapta. Она после использования не освобождает dll . dll освобождается только после закрытия сеанса axapta. Извините, что не понятно изложил.
C уважением, Дмитрий |
|
09.04.2012, 11:07 | #4 |
Участник
|
Задачу удалось решить. Возможно это кому-нибудь пригодится. В С# не требуется указывать явную загрузку dll (в нашем случае dll производителя оборудования), загрузка произойдет автоматически при инициализации класса. В деструктор добавляю поиск hModule этой dll и явно делаю FreeLiblary по количеству загруженных копий. Что бы не было в дальнейшем ошибки при создании экземпляра класса, в конструктор добаляю LoadLiblary. Таким образом не страшно, что в axapta не выгружается dll на С#, сама dll следит за используемыми ресурсами.
С уважением, Дмитрий. |
|
09.04.2012, 11:10 | #5 |
Участник
|
А почему не используете dll производителя напрямую в Аксапте без врапера?
__________________
Axapta v.3.0 sp5 kr2 |
|
09.04.2012, 11:15 | #6 |
Участник
|
Дело в том, что dll производителя, делает загрузку еще нескольких своих dll. И запуск ее на прямую выдавал ошибку загрузки этих dll. Разобраться с причиной такого поведения не удалось. Обвязка на С# вызывает все корректно и представляет интерфейс Х++ прямо к классу.
С уважением, Дмитрий. |
|