| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Указатель на делегат |
| Автор: Red Wind 9.5.2007, 13:26 |
| С праздником! У меня есть определённый делегат. Нужно получить указатель на на этот делегат, что бы использовать в unmenaged коде. Вообще в framework 2.0 есть специальный метод Marshal.GetFunctionPointerForDelegate. Но мне нужно обойдтись возможностями первого фрэймворка. Скажите, как это мождно сделать? |
| Автор: marcusmae 9.5.2007, 14:01 | ||||
| И Вас с праздником! http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/07/28/10560.aspx
Подойдёт? |
| Автор: Red Wind 9.5.2007, 15:31 |
| Боюсь, что не пойдёт. С++ я не знаю, и разобраться с этим для меня проблема. |
| Автор: marcusmae 9.5.2007, 17:30 | ||
Наверно, так или иначе Вам придётся написать managed/unmanaged мост. Из всего семейства языков .NET сочетать managed и unmanaged можно только в плюсах... Вдруг помогут мои комментарии к коду?
Всё это можно было бы положить в dllку на плюсах (CLR Class Libary) и, подключив к вашему C#-ому проекту, использовать с включёнными указателями (unsafe)... |
| Автор: Red Wind 9.5.2007, 20:29 |
| Спасибо за столь подробное объяснение! Но скорее всего я немного запутался с постановкой задачи:(. Нужно полчить не указатель на делегат, а просто указатель на нейкий метод и положить этот указатель в класс IntPtr. Вот. Просто во втором фрэймворке имея возможность воспользоваться Marshal.GetFunctionPointerForDelegate это делается через делегаты. |
| Автор: MFSham 10.5.2007, 00:32 |
| Может чего полезного найдешь по этой ссылке: http://www.intuit.ru/department/pl/csharp20/14/csharp20_14.html |
| Автор: Red Wind 10.5.2007, 22:19 |
| 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 10.5.2007, 23:43 | ||
А как вы сочетаете unmanaged код с managed ? Если речь о простом вызове функции из unmanaged DLL через [DllImport], то можно объявить указатель как обычный делегат и передавать его соответственно:
|
| Автор: marcusmae 11.5.2007, 21:35 |
Обычно документация отсутствует, если метод (класс) помечен deprecated (устаревший). |