Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > NET & DLL


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

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

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

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


Вот это вообще не понял. Ты имеешь в виду, что нужно использовать MTA или что? И почему? И что там с формой?

Автор: Breezy 9.12.2006, 17:38
Exception
Длл создает обект new XXXX (клас унаследован от интерфейса), передает редактору указатель..., тот поюзав обект, удаляет его: delete... в этот момент винда мне и говорит куда ты лезеш а? память была выделена длл....

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

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

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

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

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


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

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

Так вот я использую managed С++ для окошка, и не managed - для своего проекта. Как оказалось оба они могут сосуществовать не мешая друг другу. Тоесть если бы я делал все в одном проекте, и подключал обекты статически то небыло бы у меня проблем, но это не круто, мне нужен именно плагин а то переписывать код по 100 раз это совсем не хорошо...

Автор: mr.DUDA 9.12.2006, 20:31
Тьфу, сорри, запутался сам и запутал человека  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

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

Автор: mr.DUDA 9.12.2006, 21:00
Так зачем его удалять ?  smile 
Удалять-то не надо.

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

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

кстати только что проверил в нутри данного проекта delete отлично работает... а вот с длл проблемі  smile 

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

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

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

Автор: Breezy 9.12.2006, 22:21
mr.DUDA

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

Как я понял чтоб убрать проблему надо всему выставить RunTime : Multi-threaded DLL;
Я немогу этого сделать для EXE smile

Автор: mr.DUDA 9.12.2006, 23:09
Цитата(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

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

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

Или у тебя программа наоборот сама делит?
обьясни подробно что за проблема!

Автор: Breezy 10.12.2006, 01:00
Выпил пива, чтоб меньше smile 

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

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



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)