c# - una - ¿Cómo funcionan las devoluciones de llamada no estáticas desde el código nativo?
devolver paquete (2)
Es un poco extraño hacer esta pregunta, porque tengo un código que parece que no debería funcionar, pero lo hace, y aunque no me quejo, ¿me gustaría confirmar por qué? LOL
Simplemente, tengo una DLL nativa de C ++ (sin CLR / soporte administrado en absoluto) que toma una devolución de llamada del código C #. El lado nativo almacena una función de devolución de llamada stdcall, que es suministrada por el lado C #. Siempre pensé que el MÉTODO de devolución de llamada (en C #) tenía que ser estático, pero no estabatico y la expresión lambda ¡¡¡TANTO trabajo "SIMPLEMENTE BIEN"! ¿Cómo se calcula el puntero "this" a partir del código nativo? Siempre pensé que el código nativo solo almacena apuntadores de funciones que no son de instancia.
Ahora, encontré un artículo en el que un tipo emitía un código IL para "puentear" entre devoluciones de llamadas administradas nativas y no estáticas. También noté este método depreciado: "Marshal.GetUnmanagedThunkForManagedMethodPtr ()". El método ya no es compatible, lo cual supongo que significa que está integrado.
Resumen de la pregunta:
¿El thunk está ahora construido nativamente en .NET al emitir código IL? Si es así, ¿en qué versión de .NET se convirtió de forma nativa?
¿El "thunk" implícito también es compatible con Mono?
Cuando se emite el IL para las devoluciones de llamada administradas, ¿qué sucede cuando se elimina la instancia a la que hace referencia el procesador de impulsos? ¿Se eliminó la IL, o podría conducir a una "fuga" de memoria, por así decirlo?
Gracias.
¿El thunk está ahora construido nativamente en .NET al emitir código IL? Si es así, ¿en qué versión de .NET se convirtió de forma nativa?
Sin IL involucrado en el thunk, sucede al emitir código nativo - un trampolín que reorganiza los argumentos para cumplir con la convención de llamadas de .NET, incluido el puntero que se guarda en caso de delegados cerrados, y luego realiza una llamada final al. Método NET en sí.
¿El "thunk" implícito también es compatible con Mono?
Esto se llama "reverse p / invoke", que debería ser fácil de buscar en los documentos Mono.
Cuando se emite el IL para las devoluciones de llamada administradas, ¿qué sucede cuando se elimina la instancia a la que hace referencia el procesador de impulsos?
Cuando el delegado es basura recolectada, la memoria utilizada por el trampolín también se libera. Por lo tanto, debe mantener activo el delegado siempre que el código nativo tenga un puntero al trampolín.
El marshaller de interoperabilidad simplemente coordina a un delegado. El delegado puede ser un delegado de clase (no this
) o un delegado de instancia (tiene un this
). Desde el punto de vista de C #, solo llama a un delegado. es decir, la misma semántica utilizada para gestionar this
con un delegado de instancia (por ejemplo, el desacoplamiento de la instancia de clase) se utiliza de manera efectiva.
Claramente, hay más cosas ocultas bajo otras coberturas (como fijación, etc.), pero generalmente no están relacionadas con lo que usted solicitó.