Вам не нужно использовать Marshal.GetFunctionPointerForDelegate (), маршаллер P / Invoke делает это автоматически. Вам нужно будет объявить делегата на стороне C #, подпись которого совместима с объявлением указателя функции на стороне C ++. Например:
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
class UnManagedInterop {
private delegate int Callback(string text);
private Callback mInstance; // Ensure it doesn't get garbage collected
public UnManagedInterop() {
mInstance = new Callback(Handler);
SetCallback(mInstance);
}
public void Test() {
TestCallback();
}
private int Handler(string text) {
// Do something...
Console.WriteLine(text);
return 42;
}
[DllImport("cpptemp1.dll")]
private static extern void SetCallback(Callback fn);
[DllImport("cpptemp1.dll")]
private static extern void TestCallback();
}
И соответствующий код C ++, использованный для создания неуправляемой DLL:
#include "stdafx.h"
typedef int (__stdcall * Callback)(const char* text);
Callback Handler = 0;
extern "C" __declspec(dllexport)
void __stdcall SetCallback(Callback handler) {
Handler = handler;
}
extern "C" __declspec(dllexport)
void __stdcall TestCallback() {
int retval = Handler("hello world");
}
Этого достаточно, чтобы начать с этого. Есть миллион деталей, из-за которых у вас могут возникнуть проблемы, и вы обязательно столкнетесь с некоторыми из них. Гораздо более продуктивным способом реализации такого рода кода является написание оболочки на языке C ++ / CLI. Это также позволяет вам обернуть класс C ++, чего вы не можете сделать с P / Invoke. Приличный учебник доступен здесь.