Pasar una función de devolución de llamada de C # a través de Interop / pinvoke

Estoy escribiendo una aplicación C # que utiliza los servicios de Interop para acceder a funciones en una DLL nativa de C ++. Ya estoy usando unas 10 funciones diferentes que funcionan.

Ahora no estoy seguro de cómo manejar pasar una devolución de llamada como parámetro para que la DLL pueda llamar a mi código.

Aquí está el prototipo de la función de la DLL:

typedef void (WINAPI * lpfnFunc)(const char *arg1, const char *arg2)

Y la función que me permite pasar el tipo anterior:

int WINAPI SetFunc(lpfnFunc f)

Aquí está mi código C # para las definiciones de delegado y función:

public delegate void Func(string arg1, string arg2);

public static void MyFunc(string arg1, string arg2)

Aquí está mi código C # para la función de interoperabilidad SetFunc:

[DllImport("lib.dll", CharSet = CharSet.Ansi)]
public static extern int SetFunc(Func lpfn);

Y finalmente aquí está el código donde llamo a la función SetFunc y le paso mi devolución de llamada:

SetFunc(new Func(MyFunc));

Desafortunadamente mi función no se llama cuando debería ser. El valor de retorno de la función SetFunc está devolviendo el código de error para un Éxito, por lo que no llama a mi función o no funciona porque mi código es incorrecto.

Respuestas a la pregunta(2)

Su respuesta a la pregunta