Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Ингео, C# не выгружается библиотека расширения

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков
Предыдущая тема :: Следующая тема  
Автор Сообщение
Володченко Станислав



Зарегистрирован: 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 перезагружать ингео не кошерно очень, особенно на начальных этапах разработки
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Михаил Власов



Зарегистрирован: 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 проблематично
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Володченко Станислав



Зарегистрирован: 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    Заголовок сообщения: Ответить с цитатой

Решение оказалось на удивление простым: запуск ГИС ИнГЕО от администратора.
Проблема пропала на корню))
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB