Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Володченко Станислав
Зарегистрирован: 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 Заголовок сообщения: |
|
|
Решение оказалось на удивление простым: запуск ГИС ИнГЕО от администратора.
Проблема пропала на корню)) |
|
Вернуться к началу |
|
 |
|