프로그래밍/예전글

C++에서 C#함수 호출(곁다리로 C#에서 C++함수 호출)

Cat체셔 2015. 6. 3. 15:32

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()
    {
        ConnectCallbackSomeFunction ); // 생성자에서 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가 있는데 느린 특징을 가지고 있기에 저는 이 방법으로 해결했습니다.