Немного странно задавать этот вопрос, потому что у меня есть код, который, кажется, не должен работать, но он работает, и хотя я не жалуюсь, я хотел бы подтвердить, почему? РЖУ НЕ МОГУ
Просто у меня есть собственная DLL C++ (без CLR/управляемой поддержки вообще), которая принимает обратный вызов из кода C#. Нативная сторона хранит функцию обратного вызова stdcall, которая предоставляется стороной C#. Я всегда думал, что МЕТОД обратного вызова (в С#) должен быть статическим, но нестатическое и лямбда-выражение ОБА работают ПРОСТО ХОРОШО!? Как указатель «this» маршалируется из собственного кода? Я всегда думал, что нативный код хранит только указатели на функции, не относящиеся к экземпляру?
Теперь я нашел статью, в которой какой-то парень создал код IL для «моста» между собственными и нестатическими управляемыми обратными вызовами. Я также заметил этот устаревший метод: «Marshal.GetUnmanagedThunkForManagedMethodPtr()». Этот метод больше не поддерживается, что, как я предполагаю, означает, что он встроен?
Резюме вопроса:
Является ли преобразование теперь встроенным в .NET путем создания кода IL? Если да, то в какой версии .NET это стало изначально поддерживаться?
Поддерживается ли неявное «thunking» в Mono?
Когда IL генерируется для управляемых обратных вызовов, что происходит, когда экземпляр, на который ссылается преобразователь, удаляется? Удален ли IL, или это может привести, так сказать, к "утечке" памяти?
Спасибо.