|  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. Разобраться с причиной такого поведения не удалось. Обвязка на С# вызывает все корректно и представляет интерфейс Х++ прямо к классу. С уважением, Дмитрий. | 
|  |