C#使用MonoPInvokeCallback,让C直接回调C#函数

来源:互联网 发布:51单片机控制机箱风扇 编辑:程序博客网 时间:2024/06/08 01:20

iOS代码:Test.mm

char* TestMakeCString(NSString *str) {    const char* string = [str UTF8String];    if (string == NULL) {        return NULL;    }        char* res = (char*)malloc(strlen(string) + 1);    strcpy(res, string);    return res;}extern "C"{    typedef void (*TestCallback)(const char*eventName);    TestCallback _myCallback;    void _TestInit(TestCallback callback){        _myCallback=callback;    }}@implementation Test-(void) test{    _myCallback(TestMakeCString(@"complete"));}@end

C#代码:test.cs

using System.Runtime.InteropServices;public class Test{    public delegate void EventHandler(string eventName, string msg);    public event EventHandler callbackHandler;        internal delegate void TestCallBack(string eventName);    [DllImport("__Internal")]    private static extern void _TestInit(TestCallBack callback);        [MonoPInvokeCallback(typeof(TestCallBack))]    public static void onCallBack(string eventName){        if(eventName=="complete"){            //do something            if(callbackHandler!=null)callbackHandler(eventName,"HIJK");        }    }     public static Test _instance;     public static Test getInstance(){       if(_instance==null){           _instance=new Test();       }       return _instance;      }            //初始接口    public void init(){        _TestInit(onCallBack);    }}

test demo:

Test test=Test.getInstance()test.init();test.callbackHandler+=handler;void handler(string eventName,string msg){  //do something}