Unity IL2CPP 中傳 deletage 給 Native plugin

在 C# 傳 callback method 到 native plugin 裡面,會先包裝成 delegate,這次在執行的時候遇到 NotSupportedException

症狀

Code 如下

  • C++ side
1
2
3
4
5
6
7
typedef void (* CallbackFunc)(int val);
extern "C"{
    void PowOf2(int val, CallbackFunc callback) {
        val *= val;
        callback(val);
    }
}
  • C# side
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
delegate void PowOf2Delegate(int val);
[DllImport("somelib")]
extern static void PowOf2(int val, PowOf2Delegate callback);

private void Start() {
    PowOf2(10, PowOf2Callback);    // << NotSupportedException
}

private void PowOf2Callback(int val) {
    Debug.Log(val);
}

Script backend 選 mono 的時候可正常執行,但選擇 IL2CPP 的時候,執行到 PowOf2 的時候會丟出 NotSupportedException

1
NotSupportedException: To marshal a managed method, please add an attribute named 'MonoPInvokeCallback' to the method definition.

解法

把 callback method 改成 static,並在前面加上 MonoPInvokeCallback 宣告

1
2
3
4
[MonoPInvokeCallback(typeof(PowOf2Delegate))]
private static void PowOf2Callback(int val) {
    Debug.Log(val);
}

Reference