es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Se requiere `Marshall.GetFunctionPointerForDelegate()`?

Quiero pasar un callback desde C# al código nativo de Rust. En línea vi estos dos métodos:

1) Pasar directamente una función que se ajuste al tipo delegado.

Api.set<em>on</em>new_connection(OnNewConnection);

// ffi
[DllImport]
public static extern Result set<em>on</em>new_connection(OnNewConnection callback);

2) Crear una instancia del delegado, realizar su marshaling y pasar el puntero:

IntPtr ptr = Marshal.GetFunctionPointerForDelegate(new OnNewConnection(OnNewConnection));
Api.set<em>on</em>new_connection(ptr);

// ffi
[DllImport]
public static extern Result set<em>on</em>new_connection(IntPtr callback);

El primer método parece funcionar bien y puedo llamar a esta función desde la DLL nativa. ¿Quizás hay más en esto y debería utilizar la clase Marshal?

Estoy usando .Net 5 o una versión más reciente.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El primer método de pasar directamente una función que se ajusta al tipo de delegado debería funcionar bien en la mayoría de los casos, como has señalado. Sin embargo, hay algunas situaciones en las que puede ser necesario utilizar la clase Marshal para crear un puntero a función.

    Por ejemplo, si estás pasando el callback a una API de C de nivel inferior que espera un puntero a función en lugar de un delegado, es posible que necesites utilizar la clase Marshal para crear un puntero a función que se pueda pasar como parámetro. Además, si necesitas pasar el callback a través de un límite donde la disposición de la memoria o las convenciones de llamada pueden diferir, la clase Marshal puede ser útil para garantizar un comportamiento correcto.

    En general, si el primer método funciona para tu caso de uso particular, es posible que no necesites utilizar la clase Marshal. Sin embargo, siempre es bueno tener un plan de respaldo en caso de que encuentres problemas o problemas de compatibilidad en el futuro.

Comments are closed.