Passing a C# callback function through Interop/pinvoke
Solution 1:
This works for me:
Calc.h (Calc.dll, C++):
extern "C" __declspec(dllexport) double Calc(double x, double y, double __stdcall p(double, double));
Calc.cpp (Calc.dll, C++):
#include "calc.h"
__declspec(dllimport) double Calc(double x, double y, double __stdcall p(double, double))
{
double s = p(x*x, y*y);
return x * y + s;
}
Program.cs (Sample.exe, C#):
class Program
{
delegate double MyCallback(double x, double y);
[DllImport("Calc.dll", CallingConvention = CallingConvention.Cdecl)]
static extern double Calc(double x, double y, [MarshalAs(UnmanagedType.FunctionPtr)]MyCallback func);
static void Main(string[] args)
{
double z = Calc(1, 2, (x, y) => 45);
}
}
Solution 2:
Can you try changing the Func delegate to
public delegate void Func([In, MarshalAs(UnmanagedType.LPStr)] string arg1, [In, MarshalAs(UnmanagedType.LPStr)] string arg2);
And the SetFunc method to
[DllImport("lib", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Winapi)]
public static extern int SetFunc(Func lpfn);