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가 있는데 느린 특징을 가지고 있기에 저는 이 방법으로 해결했습니다.
'프로그래밍 > 예전글' 카테고리의 다른 글
라즈베리파이2 모델B 구매 및 설치 후기 (0) | 2016.01.31 |
---|---|
cocos2d-x NDK r10c 필드에서 to_string 지원이 안됨(stringstream의 사용) (0) | 2015.06.10 |
Unity 빌드할 때 유의사항 (0) | 2015.06.03 |
[c++11] std function으로 delegate(callback)구현하는 법 (0) | 2015.05.25 |
command line에서 폴더 삭제 (0) | 2015.03.20 |