49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
1

Вызов метода(делегата) из неуправляемого кода

13.07.2012, 21:19. Показов 3288. Ответов 11
Метки нет (Все метки)

Есть способ передать адрес делегата в неуправляемый код как адрес функции, кто нибудь решил эту задачу для использования в своих проектах? В интернете есть много жаждущих вызвать из неуправляемого кода - код исполняемый clr, я один из них. Вроде инфы прочитал много, а реализовать не хватает тяму.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.07.2012, 21:19
Ответы с готовыми решениями:

Вызов неуправляемого кода из длл
Замучался с маршилингом! Есть функция в длл: RetCode = HMM_Path_Init( char *path ); RetCode –...

Вызов метода C# из JS-кода
Здравствуйте. Я вызываю метод C# в JS следующим способом: public partial class UClass:...

При сравнении экземпляра делегата с именем метода, имя метода преобразуется автоматически в делегат или нет?
Добрый день. Есть несколько вопросов про событий и делегаты: 1) При сравнении экземпляра делегата...

Запуск неуправляемого кода внутри кода c#
часто требуется при выполнении программы запускать исполняемые файлы (exe) с ключами. Для этого...

11
Почетный модератор
Эксперт .NET
8713 / 3665 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
13.07.2012, 21:29 2
danrusm, посмотрите WinAPI функцию EnumWindows и примеры на C# с ней... имхо, Вы где-то не там примеры искали...
C
1
2
3
4
5
6
7
8
9
__declspec(dllexport)
void __stdcall
MsgBox (
    void *func
    )
{
    // Вызываем функцию с прототипом void (__stdcall*)(char*)
    ((void (__stdcall*)(char*))func)("Hello");
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        delegate void func ( [MarshalAs( UnmanagedType.LPStr )] string msg );
 
        [DllImport( @"testdll.dll" )]
        static extern void MsgBox ( func f );
 
        static void f ( string msg )
        {
            // msg == "Hello"
            Debugger.Break();
        }
 
        static void Main ( string[] args )
        {
            MsgBox( f );
        }
1
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
13.07.2012, 22:39 3
SSTREGG, тут насколько я понимаю наоборот, требуется из pure C выдернуть метод, написанный на шарпе
0
Почетный модератор
Эксперт .NET
8713 / 3665 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
13.07.2012, 22:55 4
Цитата Сообщение от Psilon Посмотреть сообщение
требуется из pure C выдернуть метод, написанный на шарпе
Не понял. Что значит "выдернуть"?
Цитата Сообщение от danrusm Посмотреть сообщение
Есть способ передать адрес делегата в неуправляемый код как адрес функции
Что и продемонстрировано мной в примере.
0
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
13.07.2012, 23:03 5
SSTREGG, имеется ввиду, что программа, написанная на C++ (например) должна использовать метод, написанный на шарпе. Выдернуть из неуправляемого значит основная программа является неуправляемой инструкцией, которая хочет вызвать метод управляемого кода.
0
Почетный модератор
Эксперт .NET
8713 / 3665 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
13.07.2012, 23:09 6
Psilon, экспорт функций что-ли? В .NET это возможно, но иногда геморно (в больших проектах), нужно редактировать IL код, есть программы это автоматизирующие (например, описание).
1
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
14.07.2012, 09:08  [ТС] 7
Дллимпорт это понятно, но как уже заметили это обратная передача, а с ней проблем нет, да и у Рихтера довольно подробно описана. Интересует именно вызов из неуправляемого кода в управляемый. Ссылки делегата тасует по памяти куча, на какое то время его можно закрепить и вызвать, только вот как. Способ с редактированием промежуточного кода не адекватен к сборке мусора, да и реализовать его неудобно.
Кстати в примере "SSTREGG" на сколько я помню делегат не обязателен, с какой целью создана цепочка с делегатом?
0
Почетный модератор
Эксперт .NET
8713 / 3665 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
14.07.2012, 12:11 8
Цитата Сообщение от danrusm Посмотреть сообщение
Способ с редактированием промежуточного кода не адекватен к сборке мусора
Чего? Это Вы откуда такую мысль извлекли?
Цитата Сообщение от danrusm Посмотреть сообщение
Кстати в примере "SSTREGG" на сколько я помню делегат не обязателен, с какой целью создана цепочка с делегатом
Для удобства, можете заменить делегат на IntPtr, и получать адрес функции через Marshal.GetFunctionPointerForDelegate.
Цитата Сообщение от danrusm Посмотреть сообщение
Ссылки делегата тасует по памяти куча, на какое то время его можно закрепить и вызвать, только вот как
GCHandle.Alloc (пример + описание)
1
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
14.07.2012, 19:21  [ТС] 9
Цитата Сообщение от SSTREGG Посмотреть сообщение
Чего? Это Вы откуда такую мысль извлекли?
Не разбирался, но многие, предлагающие править промежуточный код, предупреждают о возможной утечке памяти, правда особо не аргументируя. Вариант с майкрософтовского сайта это опять же смешанный код, в принципе единственный адекватный метод, но по определению является прослойкой, если пишешь на сишарпе. Хотелось бы атрибут, вроде dllimport, желательно без установки в GAC.
Если вы разобрались с корректировкой промежуточного кода, не могли бы на пальцах объяснить почему метод становится экспортируемым?
0
Почетный модератор
Эксперт .NET
8713 / 3665 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
14.07.2012, 20:56 10
Цитата Сообщение от danrusm Посмотреть сообщение
предлагающие править промежуточный код, предупреждают о возможной утечке памяти
Если править криво, то и результат будет соответствующий.
Цитата Сообщение от danrusm Посмотреть сообщение
Вариант с майкрософтовского сайта это опять же смешанный код
Это C++/CLI, без проблем переводится на C#.
Цитата Сообщение от danrusm Посмотреть сообщение
Хотелось бы атрибут, вроде dllimport, желательно без установки в GAC
Посмотрите ссылку которую я приводил в 6 сообщении.
Цитата Сообщение от danrusm Посмотреть сообщение
не могли бы на пальцах объяснить почему метод становится экспортируемым
Сам я этим почти не пользовался (не было необходимости), принцип вот какой:
  • Сначала правится Runtime Flag в CLI заголовке (.corflags) на COMIMAGE_FLAGS_32BITREQUIRED (т.е. работать будет только в 32-bits системах, по данным из CLI Specification (сам в 64 битах запускать не пробовал, возможно WOW64 нормально проглотит));
  • Затем создается таблица экспорта, которая заполняется компилятором в процессе компилирования. Таблица создается при помощи IL директив .vtfixup, .data, .vtentry, .export (описание всех директив есть в спецификации CLI, и по ссылке в 6 сообщение пример с частичным описанием)
Т.е. в итоге получается смешанная сборка.
1
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
15.07.2012, 09:14  [ТС] 11
Цитата Сообщение от SSTREGG Посмотреть сообщение
Это C++/CLI, без проблем переводится на C#.
Не совсем понял как смешанный код можно перевести на C#. Взаимодействовать можно, но чтоб перевести. По идее управляемый класс не может содержать неуправляемый код.
Почитал про сторонние библиотеки для экспорта методов, народ поплёвывается, хотя может и руки кривые.
0
Почетный модератор
Эксперт .NET
8713 / 3665 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
15.07.2012, 12:40 12
Цитата Сообщение от danrusm Посмотреть сообщение
Не совсем понял как смешанный код можно перевести на C#
Там же пример с GCHandle (что Вы и спрашивали для закрепления объекта), используется managed код который перевести можно, ведь C# managed.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.07.2012, 12:40
Помогаю со студенческими работами здесь

Подключение неуправляемого кода
Есть код на С++ struct auth_answer{ int TType; /**< тип транзакции. см...

опасности неуправляемого кода
какие опасности несет в себе неуправляемый код. На ум приходит только назначение переменным...

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что...

Быстродействие управляемого и неуправляемого кода
начал изучать небезопасный код,написал прогу в ней 2 функции одна с управляемым кодом вторая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru