6

I have two apps. One of them is written in visual c++ and the other is a unity app, both are running on windows. In my scenario, I want to call a unity function and draw an object whenever user presses on a button in my c++ app. So far, I have tried to load unity executable into the same address space with the c++ app by calling mono_domain_assembly_open. However, it always returns null and I am not able to call mono_jit_exec to run unity app. Is this possible to maintain two way communication between those two applications using mono? Thanks in advance!

okante
  • 97
  • 2
  • 11

1 Answers1

5

Here is an old example I have, based off of this post. What you want is to pass your C# delegate to C++ as a function pointer. You can store that function pointer for use by your button, or whatever else you'd like.

C++ DLL:

typedef int ( __stdcall *UnityCallback )( int );

static UnityCallback gCallBack;
extern "C" __declspec( dllexport )
inline int CallbackExample( UnityCallback unityFunctionPointer, int n )
{
    gCallBack = unityFunctionPointer;
    if( gCallBack )
    {
        return gCallBack( n );
    }
    return 0;
}

C# Caller:

using UnityEngine;
using System;
using System.Runtime.InteropServices;

public class Callback : MonoBehaviour {
    public delegate int CallbackDelegate( int n );

    [DllImport ("UnityPluginCallback")]
    private static extern int CallbackExample(CallbackDelegate fp, int n);

    void Awake()
    {
        int result = CallbackExample(new CallbackDelegate(this.CallbackTest), 42);
        Debug.Log("Result from callback, should be 43: " + result);
    }


    int CallbackTest( int n )
    {
        Debug.Log("Received: " + n + " from C++ dll");
        return n+1;
    }
}

In my example, the C++ DLL immediately calls the C# callback with a value of 42. C#'s callback increments this value by 1 and returns it to C++ which in turn returns it to C# at the CallbackExample call site.

Unity doesn't like it when you try to access the engine outside of the main thread so I'm not sure what happens if your C++ DLL has asynchronous calls back to C#. In my example the calls starts in the main unity thread so there aren't an issues. I would suggest you do not allow any Unity specific functionality in the C# callback, instead use the callback to set a boolean(or some other mechanism) to be used by Update to implement whatever it is you want from the Unity engine.

Jerdak
  • 3,997
  • 1
  • 24
  • 36