Есть необходимость написать приложение разбирающее мат выражение с помощью дерева.
Т.к. в С# нет указателей решил писать на С++. Проблема в том что при подключении DLLк С# экзешнику, который тестирует библиотеку невозможно запустить отладку в коде библиотеки. Бреакпоинтыпросто не срабатывают. Как сделать так чтобы я мог отлаживать баблиотеку?
Само приложение будет выглядеть так: с формы в С# передается выражение в DLL, она возрашает вычисленное значение и структуру чтобы нарисовать дерево на форме.
P.S. если есть какие нибудь другие предложения по реализации, выслушаю с удовольствием.
P.S.S C++.Net знаю плохо, врядли напишу gui на нем
13 ноября 2009 в 14:05
Ребята, у нас осталось несколько коробок Visual Studio по акции с 80% скидкой
Visual Studio Standard – 4000р.
Visual Studio Professional – 8500р.
Кому нужно – пишите мне на e.kramarenko@legalsw.ru или звоните (812) 600-40-41
Также есть льготные предложения по MSDN
//legalsw.ru
28 октября 2009 в 21:02
Все написал дерево на шарпе.спасибо всем за советы.
28 октября 2009 в 15:01
Имхо, в данной задаче не требуется понимания работы ОС.
Для того, чтобы пользоваться пылесосом, не обязательно же знать, как он работает?
28 октября 2009 в 13:01
>> Не путайте человека. На нете все проще.
Может и проще – на что я и ответил "Может С# так и позволяет сделать…" Но помоему это не упрощает, а наоборот запутывает в понимании работы ОС. Как бы там C# не делал снаружи, внутри он все равно сделает статическую или динамическую линковку, пусть даже это сокрыто от ваших глаз… но кто от этого выиграет? Хотя каждый сам выбирает свой путь Кодера… А Рихтера все равно советую почитать )
28 октября 2009 в 12:00
#13 Что именно? Отладка дллки, написанной на шарпе, подключенной к экзешнику, написанному на шарпе? Несомненно.
2 Cyber Max
Не путайте человека. На нете все проще. Если прописаны зависимости проекта (references) от каких-то дллек, то компилятор сам разбирается откуда и что брать. Никакой работы с либами и прочим нет. Вся мета-информация хранится в самой дллке. А то, что Вы описываете, тоже правда, но относится к нативному коду
Имхо, Managed C++ (который использует автор) нужен только для связки нетовского кода с нативным в случаях, когда требуется нечто большее, чем вызов пары функций.
28 октября 2009 в 1:00
Cyber Max
Я не профи в программировании никак не тянуну даже на опытного человека. я самоучка.Ячитаю книги и страюсь что то понять.
для меня была цель сделать дерево с указателями и я его пытаюсь сделать.
>>Может С# так и позволяет сделать, но по логике вещей тут даже не >>вызов функции из DLL, а просто вызов коструктора из файла который >>написан в стиле С++ и подключен к проекту С# якобы созданный для DL
да именно я так и хотел сделать. просто сделать чтобы работало. просто мне отчитали курс СИНТАКСИСА си и я пытаюсь сделать дерево на нем чтобы с ним работать на шарпе.я не тупо копирую код из книг я частично понимаю что делаю, но лишь частично. именно суть как все происходит я не знаю.(те я плохо понимаю концепцию exe-dll)
У меня вопрос есть именно к вам, как к человеку понимающему как вижу:
#2 это думаю сработает?
P.S. я начинал с бейсика не пинаете сильно меня.
28 октября 2009 в 1:00
Рихтера я читал лишь C# via Net
если найду то что вы посоветовали обязательно прочту.
27 октября 2009 в 23:03
>> не понял почему вы назвали вызов конструктора из си шарпа бредом
Потому что если вы делаете именно так – то нарушается все концепция DLL <-> EXE. Может С# так и позволяет сделать, но по логике вещей тут даже не вызов функции из DLL, а просто вызов коструктора из файла который написан в стиле С++ и подключен к проекту С# якобы созданный для DLL.
DLL – динамически подгрудаемая библиотека которая ЭКСПОРТИРУЕТ ТОЧКИ ВХОДА в функции, ни какие НИ КЛАССЫ и.т.д. а именно функции!!!
Экспортуруемая функция в DLL описывается выражением вида
__declspec(dllexport) void* SomeFunction(, , , );
(void* – тут может быть любое возвращаемое значение)
а чтобы указать компилятору что вы хотите использовать экспортуруемую функцию в EXE нужно описать ее так:
__declspec(dllimport) void* SomeFunction(, , , );
тоесть в DLL – EXPORT в EXE – IMPORT.
Чтобы компилятор нашел код вашей функции вы должны подключить к компиляции проекта *.lib файл который создается рядом с *.dll и укажет компилятору где искать вызов при исполнении exe-шника, ну или использовать динамическую загрузку DLL к EXE – с помощью WINAPI: LoadLibrary()/GetProcAddress(), тогда вы сами определяете адресс функции и сами подгружаете DLL-ку.
И только после этого ваша функция будет вызвана из DLL… а так извините вообще непонятно что и откуда вызывается.
Советую почитать Джефри Рихтера "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows" он хорошо описывает принципы работы с DLL.
27 октября 2009 в 22:04
это не то что есть. это пример на псевдокоде. специально для Cyber Max.если будет не понятно могу в выходные вам выслать исходники на почту(мыло в личку).не понял почему вы назвали вызов конструктора из си шарпа бредом
dll c++//синтаксис и семантика не сохранена.лишь смысл
public class temp
{
public temp(string^ exp)
{
//тут код конструктора
}
exe c#
Main
{
temp t = new temp("2+2");
}
26 октября 2009 в 18:05
>> 1 создается экземпляр класса описаный в dll и вызывается его
>> конструктор и потом тестовый метод
Я имел в виду способ передачи по средствам вызова функции из DLL,
как выглядит в C# вызов?
или (даже трудно представить такой бред) вызывается конструктор из кода на C# ?
>> 4 трудно код большой будет запутаешься
Вообще не понимаю в чем трудность:
Доходим в отладчике до вызова функции:
—-> nRes = SomeFunctionFromDll(, , ,);
вместо F8 переключаемся в режим ассемблера:
—-> push param1
push param2
push param3
сallSomeFunctionFromDll
на вызове call давим F8 для входа в функцию.
как только оказались там снова переключаемся в режим исходного кода и продолжаем.
>> 5 аналогично
Что тут трудного в начале
int SomeFunctionFromDll(, , , )
{
__asm int 3;
….
}
И хочешь не хочешь, а в отладчик вывалишся который должен подхватить символы DLL-ки и перейти в нормальный режим отладки кода…
26 октября 2009 в 17:05
#2 спасибо как то даже не думал попробую.
#4 такие бреаки не срабатывают.
#5
1 создается экземпляр класса описаный в dll и вызывается его конструктор и потом тестовый метод
2 методы срабатываю отлично
3 DEDUG
4 трудно код большой будет запутаешься
5 аналогично
#8 попробую
26 октября 2009 в 16:01
В настройках C# проекта в секции Debug поставь галочку Enable unmanaged code debugging
26 октября 2009 в 14:04
xD
26 октября 2009 в 14:00
#5 Чувак, ты слишком умный – тебе это мешает ))))
26 октября 2009 в 13:05
1-е каким именно способом передается выражение в DLL ?
2-е не забываем про соглашения о вызовах функция в "С"-языках
3-е DLL – DEBUG или RELEASE?
4-е есть режим ассемблерной отладки доходим до вызова call и выбираем пошаговую отладку с заходом в функцию, как окажимся внутри dll переключаемся в режим отладки по коду (если конечно DEBUG dll)
5-е Ну и конечно __asm int 3 никто не отменял еще…
26 октября 2009 в 13:03
Запустить проект дллки.
Понатыкать там брейкпоинтов.
В свойствах проекта dll указать название шарповского эзешника.
Запустить отладку из dll проекта.
Это если я правильно понимаю ваши желания.
26 октября 2009 в 13:00
.
26 октября 2009 в 12:02
А чем C# не устроил? Для дерева необязятельно иметь указатели, шарповые ссылки прекрасно подходят. Вот если будет тормозить, то имеет смысл писать на плюсах… а так – лучше использовать шарп. Имхо.