Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> NET & DLL 
:(
    Опции темы
Breezy
Дата 9.12.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 21.8.2003

Репутация: нет
Всего: 1



Пишу небольшой плагинчик под маленький редактор. Чтобы не заморачиваться с окошками юзаю форму NET-а.

Так вот, DLL создает некий класс, про который редактору ничего не извесно. Редактор поюзав этот класс через интерфейсы рано или поздно хочет удалить его. Так вот погугливши выяснил, что спасти меня может если все скомпилить с RunTime : Multi-threaded DLL. Но тут возникает маленткая проблемка!!! Форму в Multi-threaded DLL запустить не так то и просто...

У когонибудь есть умные идеи?

PM MAIL   Вверх
Exception
Дата 9.12.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Цитата(Breezy @  9.12.2006,  16:11 Найти цитируемый пост)
Редактор поюзав этот класс через интерфейсы рано или поздно хочет удалить его. Так вот погугливши выяснил, что спасти меня может если все скомпилить с RunTime : Multi-threaded DLL. Но тут возникает маленткая проблемка!!! Форму в Multi-threaded DLL запустить не так то и просто...


Вот это вообще не понял. Ты имеешь в виду, что нужно использовать MTA или что? И почему? И что там с формой?
PM   Вверх
Breezy
Дата 9.12.2006, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 21.8.2003

Репутация: нет
Всего: 1



Exception
Длл создает обект new XXXX (клас унаследован от интерфейса), передает редактору указатель..., тот поюзав обект, удаляет его: delete... в этот момент винда мне и говорит куда ты лезеш а? память была выделена длл....
PM MAIL   Вверх
mr.DUDA
Дата 9.12.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Breezy, удалить экземпляр managed-объекта можно только с пом. managed-операции delete. А вы как его удаляете ?


--------------------
user posted image
PM MAIL WWW   Вверх
DarkDragon
Дата 9.12.2006, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: нет
Всего: 8



Цитата(mr.DUDA @  9.12.2006,  19:20 Найти цитируемый пост)
managed-операции delete.

Не понял. Откуда же в .NET появилась ф-ция делить? Или это только на C++/C++.NET распространяется?
PM MAIL   Вверх
Breezy
Дата 9.12.2006, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 21.8.2003

Репутация: нет
Всего: 1



mr.DUDA
>Breezy, удалить экземпляр managed-объекта можно только с пом. managed-операции delete. А вы как его удаляете? 

Скажем так, я использую не managed С++, возможно проблема именно в том, что у управляяемого С++ свой delete smile интересно можно его какнибудть обойти?


DarkDragon
>Не понял. Откуда же в .NET появилась ф-ция делить? Или это только на C++/C++.NET распространяется? 

Я использую нетовскиую форму только потому что на ней можно быстро накидать окошки. На голом WinApi делать - убийство, MFC - та ещё дрянь: остаеться один .NET

Так вот я использую managed С++ для окошка, и не managed - для своего проекта. Как оказалось оба они могут сосуществовать не мешая друг другу. Тоесть если бы я делал все в одном проекте, и подключал обекты статически то небыло бы у меня проблем, но это не круто, мне нужен именно плагин а то переписывать код по 100 раз это совсем не хорошо...
PM MAIL   Вверх
mr.DUDA
Дата 9.12.2006, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Тьфу, сорри, запутался сам и запутал человека  smile. Конечно же, оператора delete в .NET нет. Есть garbage collector который прибивает объекты, на которые нет ссылок. Есть деструктор (финалайзер), который определяется в классе. Операции delete нет. Но вопрос остаётся в силе:

Цитата(Breezy @  9.12.2006,  16:38 Найти цитируемый пост)
тот поюзав обект, удаляет его: delete... в этот момент винда мне и говорит куда ты лезеш а? память была выделена длл....

Неужто, объект созданный в .NET окружении вы удаляете обычным оператором delete в win32 dll ?

Добавлено @ 20:35 
Цитата(Breezy @  9.12.2006,  19:30 Найти цитируемый пост)
 возможно проблема именно в том, что у управляяемого С++ свой delete


Цитата(Breezy @  9.12.2006,  19:30 Найти цитируемый пост)
Так вот я использую managed С++ для окошка, и не managed - для своего проекта. Как оказалось оба они могут сосуществовать не мешая друг другу.

Скорее всего, сказалось то что в "смешанном" C++ есть оператор delete, который можно применить к объекту или участку памяти, выделенному оператором new; но это не даёт права удалять объект, выделенный оператором gcnew (в шарпе - просто new). Все managed-объекты удалять не нужно, сборщик мусора убъёт их сам.

Добавлено @ 20:36 
А чтобы закрыть форму, достаточно вызвать её метод Close


--------------------
user posted image
PM MAIL WWW   Вверх
Breezy
Дата 9.12.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 21.8.2003

Репутация: нет
Всего: 1



mr.DUDA
Не смовсем так!!! Я использую Форму только для того, чтобы юзать нетовские кнопочки!!! На этом работа Manage C++ закончилась!!! DLL написана на голом WinApi, и использует обыкновенный new. просто я немогу удалить обект созданый в длл. Напиши я тоже самое в проекте который обращаеться к длл и delete отлично сработает )

Это сообщение отредактировал(а) Breezy - 9.12.2006, 20:58
PM MAIL   Вверх
mr.DUDA
Дата 9.12.2006, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Так зачем его удалять ?  smile 
Удалять-то не надо.


--------------------
user posted image
PM MAIL WWW   Вверх
Breezy
Дата 9.12.2006, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 21.8.2003

Репутация: нет
Всего: 1



mr.DUDA
Это те кто под НЕТ работают могут себе позволить не убирать за собой, надеясь, что сборщик мусора прожует все, даже файлы открытые с флагом только чтение и оставленные последнему...

Проблема в том, та часть проекта которая не являеться manage C++ активно юзает delete

кстати только что проверил в нутри данного проекта delete отлично работает... а вот с длл проблемі  smile 
PM MAIL   Вверх
mr.DUDA
Дата 9.12.2006, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Проблема в том, что unmanaged С++ смешивается с managed. Вот и возникает путаница. ИМХО.

Явно удалять объекты, созданные в управляемой куче -- нельзя. Но можно и нужно освобождать ресурсы (файл, GUI-ресурсы, коннекшны к БД и т.п.), для этого есть метод Dispose, реализуемый практически каждым классом "жующим ресурсы".

В случае .NET, если объект был создан для класса из внешней длл, это ничего не меняет.


--------------------
user posted image
PM MAIL WWW   Вверх
Breezy
Дата 9.12.2006, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 21.8.2003

Репутация: нет
Всего: 1



mr.DUDA

Давай посудим:
dll - unmanaged C++
exe unmanaged C++/managed C++;

Как я понял чтоб убрать проблему надо всему выставить RunTime : Multi-threaded DLL;
Я немогу этого сделать для EXE smile
PM MAIL   Вверх
mr.DUDA
Дата 9.12.2006, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Breezy @  9.12.2006,  21:21 Найти цитируемый пост)
exe unmanaged C++/managed C++;

Цитата(Breezy @  9.12.2006,  21:21 Найти цитируемый пост)
Как я понял чтоб убрать проблему надо всему выставить RunTime : Multi-threaded DLL;

Что-то я не соображу, каким это боком изменение C++ runtime на Multi-threaded разрешит unmanaged dll-ке делать unmanaged delete над формой.  smile


--------------------
user posted image
PM MAIL WWW   Вверх
DarkDragon
Дата 9.12.2006, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: нет
Всего: 8



Чета нифега не понял!
Где у тебя форма в DLL, или в самой программе?
Если тебе нужно удалить unmanaged обьекты, пишешь delete [обьект];,
Если же тебе нужно удалить managed обьекты, если есть метод Dispose() вызываешь его, ставишь NULL, и вызываешь коллектора:

Form1 frm = New Form1();
frm.ShowDialog();
frm.Dispose();
frm = NULL;
GC.Collect();
// Все. Unmanaged ресурсы (используемые формой иконки, курсор, и т. д.) стерты, ссылка на класс frm, обнуляется, больше //рефереса, не имеет, коллектор его кушает!

Или у тебя программа наоборот сама делит?
обьясни подробно что за проблема!
PM MAIL   Вверх
Breezy
Дата 10.12.2006, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 21.8.2003

Репутация: нет
Всего: 1



Выпил пива, чтоб меньше smile 

так постараюсь по пунктам:
1. Пишу на С++ проект.
2. Пишу редактор для проекта(с испольованием НЕТ)
3. К редактору подключаетьс ряд плагинов(dll), плагины относяться к С++ проекту(пункт 1)
4. Редактор(обычная нетовская форма), по нажатию всяких кнопочек управляет классом из проекта под пунктом 1.
5. ДЛЛ создает некий класс, и передает в редактор, где этим класом далее управляет проект п.1

Так вот изначально проект 1 был задуман как "single tread", но чтоб подключить плагин пришлось его сделать многопоточным, иначе нелязя удалять память выделенную в другом потоке. Итак сам проект, длл я могу без особых проблем скомпилить, а нетовскую фору в Multi-threaded DLL преобразовать не получаеться (



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1374 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.