| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > NET & DLL |
| Автор: Breezy 9.12.2006, 15:11 |
| Пишу небольшой плагинчик под маленький редактор. Чтобы не заморачиваться с окошками юзаю форму NET-а. Так вот, DLL создает некий класс, про который редактору ничего не извесно. Редактор поюзав этот класс через интерфейсы рано или поздно хочет удалить его. Так вот погугливши выяснил, что спасти меня может если все скомпилить с RunTime : Multi-threaded DLL. Но тут возникает маленткая проблемка!!! Форму в Multi-threaded DLL запустить не так то и просто... У когонибудь есть умные идеи? |
| Автор: 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 |
Не понял. Откуда же в .NET появилась ф-ция делить? Или это только на C++/C++.NET распространяется? |
| Автор: Breezy 9.12.2006, 20:30 |
| mr.DUDA >Breezy, удалить экземпляр managed-объекта можно только с пом. managed-операции delete. А вы как его удаляете? Скажем так, я использую не managed С++, возможно проблема именно в том, что у управляяемого С++ свой delete DarkDragon >Не понял. Откуда же в .NET появилась ф-ция делить? Или это только на C++/C++.NET распространяется? Я использую нетовскиую форму только потому что на ней можно быстро накидать окошки. На голом WinApi делать - убийство, MFC - та ещё дрянь: остаеться один .NET Так вот я использую managed С++ для окошка, и не managed - для своего проекта. Как оказалось оба они могут сосуществовать не мешая друг другу. Тоесть если бы я делал все в одном проекте, и подключал обекты статически то небыло бы у меня проблем, но это не круто, мне нужен именно плагин а то переписывать код по 100 раз это совсем не хорошо... |
| Автор: mr.DUDA 9.12.2006, 20:31 | ||||||
Тьфу, сорри, запутался сам и запутал человека
Неужто, объект созданный в .NET окружении вы удаляете обычным оператором delete в win32 dll ? Добавлено @ 20:35
Скорее всего, сказалось то что в "смешанном" 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 |
| Так зачем его удалять ? Удалять-то не надо. |
| Автор: Breezy 9.12.2006, 21:16 |
| mr.DUDA Это те кто под НЕТ работают могут себе позволить не убирать за собой, надеясь, что сборщик мусора прожует все, даже файлы открытые с флагом только чтение и оставленные последнему... Проблема в том, та часть проекта которая не являеться manage C++ активно юзает delete кстати только что проверил в нутри данного проекта delete отлично работает... а вот с длл проблемі |
| Автор: 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 |
| Автор: mr.DUDA 9.12.2006, 23:09 | ||
Что-то я не соображу, каким это боком изменение C++ runtime на Multi-threaded разрешит unmanaged dll-ке делать unmanaged delete над формой. |
| Автор: 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 |
| Выпил пива, чтоб меньше так постараюсь по пунктам: 1. Пишу на С++ проект. 2. Пишу редактор для проекта(с испольованием НЕТ) 3. К редактору подключаетьс ряд плагинов(dll), плагины относяться к С++ проекту(пункт 1) 4. Редактор(обычная нетовская форма), по нажатию всяких кнопочек управляет классом из проекта под пунктом 1. 5. ДЛЛ создает некий класс, и передает в редактор, где этим класом далее управляет проект п.1 Так вот изначально проект 1 был задуман как "single tread", но чтоб подключить плагин пришлось его сделать многопоточным, иначе нелязя удалять память выделенную в другом потоке. Итак сам проект, длл я могу без особых проблем скомпилить, а нетовскую фору в Multi-threaded DLL преобразовать не получаеться ( |