| Предыдущая тема :: Следующая тема   | 
	
	
	
		| Автор | 
		Сообщение | 
	
	
		Володченко Станислав
 
 
  Зарегистрирован: 01.12.2005 Сообщения: 18 Откуда: Питер
  | 
		
			
				 Добавлено: Чт 04 Фев 2010 19:58    Заголовок сообщения: Ингео, C# не выгружается библиотека расширения | 
				     | 
			 
			
				
  | 
			 
			
				Привет всем!
 
 
Проблема вот какая.
 
 
Был написан тестовый пример (VS2005/C#) для Ингео, подкдючение стандартное через скрипт
 
 
 	  | Код: | 	 		  Dim Obj
 
 
Sub StartObj()
 
   
 
   Set Obj = CreateObject("IngeoDLLTest.myCoClass")
 
   Obj.Start Application
 
End Sub
 
 
 
Sub StopObj()
 
   Obj.Stop
 
   Set Obj = nothing
 
End Sub | 	  
 
 
 
в КОМ-сервере такой вот код
 
 
 
 	  | Код: | 	 		  
 
namespace IngeoDLLTest
 
{
 
    [ComVisible(true), Guid("A4FB9713-29AE-4e2d-9034-071BF2B0348F")]
 
    public interface IIngeoDLLtest 
 
    {
 
        void Start(IIngeoApplication IngeoApplication);
 
        void Stop();
 
    }
 
    
 
    public class myCoClass : IIngeoDLLtest, IDisposable  
 
    {
 
        [System.Runtime.InteropServices.DllImport("Kernel32")]
 
        private extern static Boolean CloseHandle(IntPtr handle);
 
        [DllImport("ole32", ExactSpelling = true, SetLastError = true)]
 
        static extern void CoFreeUnusedLibrariesEx(int dwUnloadDelay, int dwReserved);
 
        private bool disposed = false;
 
        private IIngeoApplication _gIA = null;
 
        private myCoForm _form = null;
 
        public void Start(IIngeoApplication IngeoApplication)
 
        {
 
            _gIA = IngeoApplication;
 
            if (_gIA != null)
 
            {
 
                _form = new myCoForm();
 
                //_form.Init(_gIA); 
 
                _form.Show();
 
            }
 
        }
 
        public void Stop()
 
        {
 
            if (_gIA != null)
 
            {
 
                _form.Close();
 
                _form.Dispose();
 
                _form = null;
 
                this.Dispose(true);
 
            }
 
        }
 
        public void Dispose()
 
        {
 
            Dispose(true);
 
            GC.SuppressFinalize(this);
 
        }
 
        private void Dispose(bool disposing)
 
        {
 
            
 
            if (!this.disposed)
 
            {
 
                if (disposing)
 
                {
 
                    //тут управляемый ресурс
 
                }
 
                Marshal.FinalReleaseComObject(_gIA);
 
                _gIA = null;
 
                GC.Collect();
 
                GC.WaitForPendingFinalizers();
 
                GC.Collect();
 
                CoFreeUnusedLibrariesEx(200, 0);
 
                Thread.Sleep(300);
 
                CoFreeUnusedLibrariesEx(20, 0);
 
                disposed = true;
 
 
            }
 
        }
 
        
 
        ~myCoClass()
 
        {
 
            Dispose(false);
 
        }
 
 
        
 
} | 	  
 
 
беда в том, что после выгрузки КОМ - объекта, соответствующая библиотека  продолжает висеть в памяти, естественно файл заблокирован, помогает только рестарт хоста (ингео).
 
 
Заранее Спасибо! | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Михаил Власов
 
  
  Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
  | 
		
			
				 Добавлено: Пт 05 Фев 2010 07:45    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Включите "Режим разработчика" (в редакторе программных модулей меню "Программа | Режим разработчика").
 
 
В этом режиме при остановке любого модуля вызывается "CoFreeUnusedLibraries", что заставляет COM выгрузить все неиспользуемые DLL. _________________ С уважением, Михаил Власов. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Володченко Станислав
 
 
  Зарегистрирован: 01.12.2005 Сообщения: 18 Откуда: Питер
  | 
		
			
				 Добавлено: Пт 05 Фев 2010 12:12    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Спасибо за совет!
 
Скрипт в ГИС придется все же останавливать? (Выгружать модуль)
 
 
вот этого недостаточно?
 
 	  | Код: | 	 		  Obj.Stop 
 
   Set Obj = nothing | 	 
  | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Володченко Станислав
 
 
  Зарегистрирован: 01.12.2005 Сообщения: 18 Откуда: Питер
  | 
		
			
				 Добавлено: Пт 05 Фев 2010 15:17    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Володченко Станислав писал(а): | 	 		  Спасибо за совет!
 
Скрипт в ГИС придется все же останавливать? (Выгружать модуль)
 
 
вот этого недостаточно?
 
 	  | Код: | 	 		  
 
Obj.Stop 
 
Set Obj = nothing | 	  
 
 | 	  
 
 
попробовал по всякому - не помогло, библиотека таки привязана к процессу ингео | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		radar
 
 
  Зарегистрирован: 29.09.2010 Сообщения: 2
 
  | 
		
			
				 Добавлено: Чт 14 Окт 2010 17:54    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				| Вопрос - кто нибудь всётаки нашёл выход из этой ситуации? ибо после каждого изменения в dll перезагружать ингео не кошерно очень, особенно на начальных этапах разработки | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Михаил Власов
 
  
  Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
  | 
		
			
				 Добавлено: Пт 15 Окт 2010 08:19    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | radar писал(а): | 	 		  | Вопрос - кто нибудь всётаки нашёл выход из этой ситуации? ибо после каждого изменения в dll перезагружать ингео не кошерно очень, особенно на начальных этапах разработки | 	  
 
Включение режима разработчика не помогает? _________________ С уважением, Михаил Власов. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		radar
 
 
  Зарегистрирован: 29.09.2010 Сообщения: 2
 
  | 
		
			
				 Добавлено: Пт 15 Окт 2010 10:18    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				нет, этот режим не помогает, в JS скрипте уже даже пробовал так :
 
 
 	  | Код: | 	 		  
 
//   Вызывается перед остановкой программного модуля
 
function Module_WillStop()
 
{
 
   ModuleObj.Done();
 
   delete ModuleObj;
 
}
 
 | 	  
 
 
причём функция dll вызывается
 
для справки : 
 
 
ИнГео версии 4,4.0.222
 
.Net Framework 4
 
 
P.S. с примером модуля на .Net который есть на сайте такая же ситуация, после остановки модуля заменить dll проблематично | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		Володченко Станислав
 
 
  Зарегистрирован: 01.12.2005 Сообщения: 18 Откуда: Питер
  | 
		
			
				 Добавлено: Ср 27 Окт 2010 12:31    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				| Ну единственный выход, который я смог найти - для разработки и отладки пользоваться MapX, а для релиза уже собирать dll, не секрет, что MapX - это непосредственно сам Ингео, но обернутый в обертку с хвостами, так что никаких сложностей быть тут не должно | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		nawakster
 
 
  Зарегистрирован: 17.06.2008 Сообщения: 59
 
  | 
		
			
				 Добавлено: Вс 28 Июл 2013 01:06    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Добрый день. Хотелось бы знать решил ли кто-нибудь эту проблему за три года?)
 
Включение режима разработчика так и не помогает. | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		feelthedifference
 
 
  Зарегистрирован: 09.02.2015 Сообщения: 1 Откуда: Выкса
  | 
		
			
				 Добавлено: Пн 09 Фев 2015 19:41    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Решение оказалось на удивление простым: запуск ГИС ИнГЕО от администратора.
 
Проблема пропала на корню)) | 
			 
		  | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		 |