singlepost

C# + С++ .Net << На главную или назад  

Есть необходимость написать приложение разбирающее мат выражение с помощью дерева.
Т.к. в С# нет указателей решил писать на С++. Проблема в том что при подключении DLLк С# экзешнику, который тестирует библиотеку невозможно запустить отладку в коде библиотеки. Бреакпоинтыпросто не срабатывают. Как сделать так чтобы я мог отлаживать баблиотеку?

Само приложение будет выглядеть так: с формы в С# передается выражение в DLL, она возрашает вычисленное значение и структуру чтобы нарисовать дерево на форме.

P.S. если есть какие нибудь другие предложения по реализации, выслушаю с удовольствием.
P.S.S C++.Net знаю плохо, врядли напишу gui на нем

19 ответов в теме “C# + С++ .Net”

  1. 18
    Екатерина Крамаренко ответил:

    Ребята, у нас осталось несколько коробок Visual Studio по акции с 80% скидкой

    Visual Studio Standard – 4000р.
    Visual Studio Professional – 8500р.

    Кому нужно – пишите мне на e.kramarenko@legalsw.ru или звоните (812) 600-40-41
    Также есть льготные предложения по MSDN
    //legalsw.ru

  2. 17
    Борис Осипов ответил:

    Все написал дерево на шарпе.спасибо всем за советы.

  3. 16
    Павел Потапов ответил:

    Имхо, в данной задаче не требуется понимания работы ОС.

    Для того, чтобы пользоваться пылесосом, не обязательно же знать, как он работает?

  4. 15
    Cyber Max ответил:

    >> Не путайте человека. На нете все проще.
    Может и проще – на что я и ответил "Может С# так и позволяет сделать…" Но помоему это не упрощает, а наоборот запутывает в понимании работы ОС. Как бы там C# не делал снаружи, внутри он все равно сделает статическую или динамическую линковку, пусть даже это сокрыто от ваших глаз… но кто от этого выиграет? Хотя каждый сам выбирает свой путь Кодера… А Рихтера все равно советую почитать :) )

  5. 14
    Павел Потапов ответил:

    #13 Что именно? Отладка дллки, написанной на шарпе, подключенной к экзешнику, написанному на шарпе? Несомненно.

    2 Cyber Max
    Не путайте человека. На нете все проще. Если прописаны зависимости проекта (references) от каких-то дллек, то компилятор сам разбирается откуда и что брать. Никакой работы с либами и прочим нет. Вся мета-информация хранится в самой дллке. А то, что Вы описываете, тоже правда, но относится к нативному коду :)

    Имхо, Managed C++ (который использует автор) нужен только для связки нетовского кода с нативным в случаях, когда требуется нечто большее, чем вызов пары функций.

  6. 13
    Борис Осипов ответил:

    Cyber Max
    Я не профи в программировании никак не тянуну даже на опытного человека. я самоучка.Ячитаю книги и страюсь что то понять.
    для меня была цель сделать дерево с указателями и я его пытаюсь сделать.
    >>Может С# так и позволяет сделать, но по логике вещей тут даже не >>вызов функции из DLL, а просто вызов коструктора из файла который >>написан в стиле С++ и подключен к проекту С# якобы созданный для DL
    да именно я так и хотел сделать. просто сделать чтобы работало. просто мне отчитали курс СИНТАКСИСА си и я пытаюсь сделать дерево на нем чтобы с ним работать на шарпе.я не тупо копирую код из книг я частично понимаю что делаю, но лишь частично. именно суть как все происходит я не знаю.(те я плохо понимаю концепцию exe-dll)
    У меня вопрос есть именно к вам, как к человеку понимающему как вижу:
    #2 это думаю сработает?
    P.S. я начинал с бейсика не пинаете сильно меня.

  7. 12
    Борис Осипов ответил:

    Рихтера я читал лишь C# via Net
    если найду то что вы посоветовали обязательно прочту.

  8. 11
    Cyber Max ответил:

    >> не понял почему вы назвали вызов конструктора из си шарпа бредом

    Потому что если вы делаете именно так – то нарушается все концепция 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.

  9. 10
    Борис Осипов ответил:

    это не то что есть. это пример на псевдокоде. специально для Cyber Max.если будет не понятно могу в выходные вам выслать исходники на почту(мыло в личку).не понял почему вы назвали вызов конструктора из си шарпа бредом
    dll c++//синтаксис и семантика не сохранена.лишь смысл
    public class temp
    {
    public temp(string^ exp)
    {
    //тут код конструктора
    }
    exe c#
    Main
    {
    temp t = new temp("2+2");
    }

  10. 9
    Cyber Max ответил:

    >> 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-ки и перейти в нормальный режим отладки кода…

  11. 8
    Борис Осипов ответил:

    #2 спасибо как то даже не думал попробую.
    #4 такие бреаки не срабатывают.
    #5
    1 создается экземпляр класса описаный в dll и вызывается его конструктор и потом тестовый метод
    2 методы срабатываю отлично
    3 DEDUG
    4 трудно код большой будет запутаешься
    5 аналогично
    #8 попробую

  12. 7
    Сергей Яценко ответил:

    В настройках C# проекта в секции Debug поставь галочку Enable unmanaged code debugging

  13. 6
    Il Il ответил:

    xD

  14. 5
    Евгений Гаврин ответил:

    #5 Чувак, ты слишком умный – тебе это мешает ))))

  15. 4
    Cyber Max ответил:

    1-е каким именно способом передается выражение в DLL ?
    2-е не забываем про соглашения о вызовах функция в "С"-языках
    3-е DLL – DEBUG или RELEASE?
    4-е есть режим ассемблерной отладки доходим до вызова call и выбираем пошаговую отладку с заходом в функцию, как окажимся внутри dll переключаемся в режим отладки по коду (если конечно DEBUG dll)
    5-е Ну и конечно __asm int 3 никто не отменял еще…

  16. 3
    Евгений Гаврин ответил:

    Запустить проект дллки.
    Понатыкать там брейкпоинтов.
    В свойствах проекта dll указать название шарповского эзешника.
    Запустить отладку из dll проекта.

    Это если я правильно понимаю ваши желания.

  17. 2
    Николай Кудряшов ответил:

    .

  18. 1
    Павел Потапов ответил:

    А чем C# не устроил? Для дерева необязятельно иметь указатели, шарповые ссылки прекрасно подходят. Вот если будет тормозить, то имеет смысл писать на плюсах… а так – лучше использовать шарп. Имхо.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.