|
Как получить фактический адрес делегата?
|
|||
---|---|---|---|
#18+
Есть замечательная статья, как можно использовать делегаты в качестве "callback" https://docs.microsoft.com/ru-ru/dotnet/framework/interop/marshaling-a-delegate-as-a-callback-method Но я так и не смог нагуглить, как получить адрес этого делегата, в смысле те циферки, что он передает функции. Гуру, поделитесь Силой ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2021, 00:56 |
|
Как получить фактический адрес делегата?
|
|||
---|---|---|---|
#18+
iskatelsql Но я так и не смог нагуглить, как получить адрес этого делегата, в смысле те циферки, что он передает функции.Гуру, поделитесь Силой Так адрес делегата, или циферки? Если первое - то какой в этом вообще смысл? Его адрес - фактически адрес ссылки на класс делегата где-то в куче. Что вы с этим собираетесь делать? CLR сама выполнит маршаллинг этого делегата без всяких манипуляций с адресами, нужно просто передать его в unmanaged-метод как обычный делегат, точно так же, как это делается и для managed-методов. Если второе - то эти циферки передаются в метод делегата в неуправляемом коде, на то он и коллбэк. Сами вы до них не доберётесь. Вот простейший пример с винапишным EnumWindows: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2021, 07:01 |
|
Как получить фактический адрес делегата?
|
|||
---|---|---|---|
#18+
Сон Веры Павловны Так адрес делегата, или циферки? Если первое - то какой в этом вообще смысл? Особенно учитывая, что мусорщик в любой момент может все это передвинуть в другое место. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2021, 11:10 |
|
Как получить фактический адрес делегата?
|
|||
---|---|---|---|
#18+
имхо компилятор и может и заинлайнить если нет замыкания, тогда и искать нечего.. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2021, 13:15 |
|
Как получить фактический адрес делегата?
|
|||
---|---|---|---|
#18+
Я понимаю, что при передаче делегата в качестве параметра с ним происходят некоторые преобразования, закрепление в памяти или что-то в этом роде. Удивительно что этого нельзя сделать вручную, столько инструментов в шарп понапихано... Вообще я хочу впилить callback туда, где его изначально не задумано. Т.е. я из нативной dll вызываю функцию f(), а она в своих недрах вызывает внутреннюю функцию x(). И я думал прямой записью в память поменять call x на call 'адрес делегата' Ну можно конечно на сях написать обертку для той dll, объявив для f() еще один параметр - адрес callback и переписывать память из обертки... А из шарпа правда чтоль никак? Он ведь даже смешанные dll умеет... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2021, 13:45 |
|
Как получить фактический адрес делегата?
|
|||
---|---|---|---|
#18+
Ну можно конечно попробовать Marshal.GetFunctionPointerForDelegate . Только как бы с таким цирком не получилось выстрелить себе в ногу. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2021, 13:58 |
|
Как получить фактический адрес делегата?
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Вот это похоже то что нужно. Но смущает одна там ремарка: "Вы должны вручную предотвратить сбор делегата сборщиком мусора из управляемого кода. Сборщик мусора не отслеживает ссылки на неуправляемый код. " Появился второй вопрос... Как это изобразить? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2021, 14:11 |
|
Как получить фактический адрес делегата?
|
|||
---|---|---|---|
#18+
iskatelsql, наверное можно пробовать в не безопасном режиме, ( указатели цементируются в контексте GC), но имхо прокси лучше. компромисный вариант - как костыль..( не типичный код ) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2021, 14:27 |
|
Как получить фактический адрес делегата?
|
|||
---|---|---|---|
#18+
iskatelsql Сон Веры Павловны, Вот это похоже то что нужно. Но смущает одна там ремарка: "Вы должны вручную предотвратить сбор делегата сборщиком мусора из управляемого кода. Сборщик мусора не отслеживает ссылки на неуправляемый код. " Появился второй вопрос... Как это изобразить? https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/fixed-statement ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2021, 14:30 |
|
Как получить фактический адрес делегата?
|
|||
---|---|---|---|
#18+
iskatelsql Как это изобразить? Просто следить, чтобы код, в котором живёт экземпляр делегата, не мог быть подобран мусурщиком - закреплять ссылку на делегат в виде поля класса, инкапсулирующий ссылку класс закреплять в виде поля в другом классе, итд итп. Например, вот здесь Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
в релизной конфигурации к моменту вызова CallFromNative мусорщик уже может убить делегат после выхода из метода Bar, т.к. никакой managed-код эту ссылку не использует. И переданный ptr будет ссылаться на несуществующий метод. И будут сюрпризы - access violation, молчаливый вылет, итд. Это именно то, что я имел в виду выше под выстрелом в ногу. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2021, 14:41 |
|
Как получить фактический адрес делегата?
|
|||
---|---|---|---|
#18+
fkthat iskatelsql Сон Веры Павловны, Вот это похоже то что нужно. Но смущает одна там ремарка: "Вы должны вручную предотвратить сбор делегата сборщиком мусора из управляемого кода. Сборщик мусора не отслеживает ссылки на неуправляемый код. " Появился второй вопрос... Как это изобразить? https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/fixed-statement https://docs.microsoft.com/ru-ru/dotnet/api/system.runtime.interopservices.gchandle?view=net-5.0 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2021, 14:47 |
|
Как получить фактический адрес делегата?
|
|||
---|---|---|---|
#18+
Оказывается (это к вопросу про выстрел в ногу) у Marshal.GetFunctionPointerForDelegate и последующего вызова Marshal.GetDelegateForFunctionPointer есть интересные сайд-эффекты (да, это запрещено в документации, а на практике - ради б-га, на свой страх и риск). ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2021, 20:28 |
|
|
start [/forum/topic.php?desktop=1&fid=20&tid=1398290]: |
0ms |
get settings: |
12ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 300ms |
total: | 431ms |
0 / 0 |