49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
|
1 | |
Вызов метода(делегата) из неуправляемого кода13.07.2012, 21:19. Показов 3288. Ответов 11
Метки нет Все метки)
(
Есть способ передать адрес делегата в неуправляемый код как адрес функции, кто нибудь решил эту задачу для использования в своих проектах? В интернете есть много жаждущих вызвать из неуправляемого кода - код исполняемый clr, я один из них. Вроде инфы прочитал много, а реализовать не хватает тяму.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
13.07.2012, 21:19 | |
Ответы с готовыми решениями:
11
Вызов неуправляемого кода из длл
При сравнении экземпляра делегата с именем метода, имя метода преобразуется автоматически в делегат или нет?
|
Почетный модератор
![]() |
|||||||||||
13.07.2012, 21:29 | 2 | ||||||||||
danrusm, посмотрите WinAPI функцию EnumWindows и примеры на C# с ней... имхо, Вы где-то не там примеры искали...
1
|
Master of Orion
![]() |
|
13.07.2012, 23:03 | 5 |
SSTREGG, имеется ввиду, что программа, написанная на C++ (например) должна использовать метод, написанный на шарпе. Выдернуть из неуправляемого значит основная программа является неуправляемой инструкцией, которая хочет вызвать метод управляемого кода.
0
|
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
|
14.07.2012, 09:08 [ТС] | 7 |
Дллимпорт это понятно, но как уже заметили это обратная передача, а с ней проблем нет, да и у Рихтера довольно подробно описана. Интересует именно вызов из неуправляемого кода в управляемый. Ссылки делегата тасует по памяти куча, на какое то время его можно закрепить и вызвать, только вот как. Способ с редактированием промежуточного кода не адекватен к сборке мусора, да и реализовать его неудобно.
Кстати в примере "SSTREGG" на сколько я помню делегат не обязателен, с какой целью создана цепочка с делегатом?
0
|
Почетный модератор
![]() |
|
14.07.2012, 12:11 | 8 |
Чего?
![]() Для удобства, можете заменить делегат на IntPtr, и получать адрес функции через Marshal.GetFunctionPointerForDelegate. GCHandle.Alloc (пример + описание)
1
|
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
|
14.07.2012, 19:21 [ТС] | 9 |
Не разбирался, но многие, предлагающие править промежуточный код, предупреждают о возможной утечке памяти, правда особо не аргументируя. Вариант с майкрософтовского сайта это опять же смешанный код, в принципе единственный адекватный метод, но по определению является прослойкой, если пишешь на сишарпе. Хотелось бы атрибут, вроде dllimport, желательно без установки в GAC.
Если вы разобрались с корректировкой промежуточного кода, не могли бы на пальцах объяснить почему метод становится экспортируемым?
0
|
Почетный модератор
![]() |
|
14.07.2012, 20:56 | 10 |
Если править криво, то и результат будет соответствующий.
Это C++/CLI, без проблем переводится на C#. Посмотрите ссылку которую я приводил в 6 сообщении. Сам я этим почти не пользовался (не было необходимости), принцип вот какой:
1
|
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
|
15.07.2012, 09:14 [ТС] | 11 |
Не совсем понял как смешанный код можно перевести на C#. Взаимодействовать можно, но чтоб перевести. По идее управляемый класс не может содержать неуправляемый код.
Почитал про сторонние библиотеки для экспорта методов, народ поплёвывается, хотя может и руки кривые.
0
|
Почетный модератор
![]() |
|
15.07.2012, 12:40 | 12 |
Там же пример с GCHandle (что Вы и спрашивали для закрепления объекта), используется managed код который перевести можно, ведь C# managed.
1
|
15.07.2012, 12:40 | |
Помогаю со студенческими работами здесь
12
опасности неуправляемого кода Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |