C++에서 C#함수 호출(곁다리로 C#에서 C++함수 호출)
C++에서 C#함수를 호출하는 방법에 대해 포스팅하겠습니다.(곁다리로 C#에서 C++함수 호출하는 방법도...)
MonoPInvokeCallback를 사용하시면 됩니다.
in C# ↓↓↓
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
using AOT;
public class SomePlugin //어떤 플러그인입니다.
{
public delegate void SomeCallback( string result ); // c++에서 호출해줄 Callback형입니다.
public static extern void ConnectCallback (SomeCallback someCallback); // c#에서 호출할 c++함수입니다.
public SomePlugin()
{
ConnectCallback( SomeFunction ); // 생성자에서 c++함수를 호출합니다.
}
[MonoPInvokeCallback(typeof(SomeCallback))] // 핵심입니다.
public static void SomeFunction(string result)
{
//something...
}
}
in C++ ↓↓↓
typedef void (*SomeCallback)(const char* result);
SomeCallback someCallback = NULL;
extern "C"
{
void ConnectCallback(SomeCallback _someCallback) //c#에서 호출할 함수입니다.
{
someCallback = _someCallback;
}
}
void SomeFunction(const char* result)
{
if( someCallback != NULL )
someCallback(result);
}
사용법은 함수포인터 쓰듯이 사용하시면 됩니다.다만 native code에서 액세스 할 수 있도록 MonoPInvokeCallback 속성을 적용해줘야합니다.
유니티에서는 비추천하는 방법입니다(함수 포인터가 주소값 접근이라 위험해서 그런건지 뭔지는 모르겠지만요). 추천하는 방법으로는 UnitySendMessage가 있는데 느린 특징을 가지고 있기에 저는 이 방법으로 해결했습니다.