![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Red Wind |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 280 Регистрация: 25.6.2004 Где: Минск Репутация: нет Всего: 2 |
С праздником!
У меня есть определённый делегат. Нужно получить указатель на на этот делегат, что бы использовать в unmenaged коде. Вообще в framework 2.0 есть специальный метод Marshal.GetFunctionPointerForDelegate. Но мне нужно обойдтись возможностями первого фрэймворка. Скажите, как это мождно сделать? |
|||
|
||||
| marcusmae |
|
||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
И Вас с праздником!
Using managed delegates from unmanaged code
Подойдёт? Это сообщение отредактировал(а) marcusmae - 9.5.2007, 14:08 -------------------- ἀπὸ μηχανῆς θεός |
||||
|
|||||
| Red Wind |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 280 Регистрация: 25.6.2004 Где: Минск Репутация: нет Всего: 2 |
Боюсь, что не пойдёт. С++ я не знаю, и разобраться с этим для меня проблема.
|
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Наверно, так или иначе Вам придётся написать managed/unmanaged мост. Из всего семейства языков .NET сочетать managed и unmanaged можно только в плюсах... Вдруг помогут мои комментарии к коду?
Всё это можно было бы положить в dllку на плюсах (CLR Class Libary) и, подключив к вашему C#-ому проекту, использовать с включёнными указателями (unsafe)... Это сообщение отредактировал(а) marcusmae - 9.5.2007, 17:35 -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| Red Wind |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 280 Регистрация: 25.6.2004 Где: Минск Репутация: нет Всего: 2 |
Спасибо за столь подробное объяснение! Но скорее всего я немного запутался с постановкой задачи:(. Нужно полчить не указатель на делегат, а просто указатель на нейкий метод и положить этот указатель в класс IntPtr. Вот. Просто во втором фрэймворке имея возможность воспользоваться Marshal.GetFunctionPointerForDelegate это делается через делегаты.
|
|||
|
||||
| MFSham |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 28.8.2005 Где: Беларусь, Гродно Репутация: нет Всего: 3 |
Может чего полезного найдешь по этой ссылке: www.intuit.ru
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны. |
|||
|
||||
| Red Wind |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 280 Регистрация: 25.6.2004 Где: Минск Репутация: нет Всего: 2 |
MFSham, спасибо за ссылку. Глянул. Может почерпну что-нибудь полезное. Но вот наткнулся на такаие методы как
System.Runtime.InteropServices.Marshal.GetManagedThunkForUnmanagedMethodPtr System.Runtime.InteropServices.Marshal.GetUnmanagedThunkForManagedMethodPtr Вот что написано в MSDN: [ObsoleteAttribute("The GetManagedThunkForUnmanagedMethodPtr method has been deprecated and will be removed in a future release.", false)] public static IntPtr GetManagedThunkForUnmanagedMethodPtr ( IntPtr pfnMethodToWrap, IntPtr pbSignature, int cbSignature ) Parameters pfnMethodToWrap A pointer to the method to marshal. pbSignature A pointer to the method signature. cbSignature The number of bytes in pbSignature. Return Value A pointer to the thunk that will marshal a call from the pfnMethodToWrap parameter. Вроде по описанию похоже на то что нужно. Но проблема в том, что нет никакой документации по ним. Пока у меня не получилось разобраться с тем как их применять. Например, как получить указатель на метод и его сигнатуру? |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
А как вы сочетаете unmanaged код с managed ? Если речь о простом вызове функции из unmanaged DLL через [DllImport], то можно объявить указатель как обычный делегат и передавать его соответственно:
-------------------- ![]() |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Обычно документация отсутствует, если метод (класс) помечен deprecated (устаревший). -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |