在 C# 傳 callback method 到 native plugin 裡面,會先包裝成 delegate,這次在執行的時候遇到 NotSupportedException
症狀
Code 如下
1
2
3
4
5
6
7
|
typedef void (* CallbackFunc)(int val);
extern "C"{
void PowOf2(int val, CallbackFunc callback) {
val *= val;
callback(val);
}
}
|
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