2013-08-15 3 views
5

У меня есть два приложения. Один из них написан на Visual C++, а другой - приложение единства, оба работают на окнах. В моем сценарии я хочу вызвать функцию единства и нарисовать объект всякий раз, когда пользователь нажимает кнопку в моем приложении C++. До сих пор я пытался загрузить единицу исполняемого файла в одно и то же адресное пространство с помощью приложения C++, вызвав mono_domain_assembly_open. Тем не менее, он всегда возвращает null, и я не могу позвонить mono_jit_exec, чтобы запустить приложение единства. Возможно ли поддерживать двухстороннюю связь между этими двумя приложениями, используя моно? Спасибо заранее!двухсторонняя связь между неуправляемым кодом и кодом единства3d

ответ

3

Вот старый пример, который я основывал на this post. Вы хотите передать делегат C# на C++ в качестве указателя функции. Вы можете сохранить этот указатель функции для использования своей кнопкой или любым другим.

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; 
    } 
} 

В моем примере C++ DLL сразу вызывает C# обратного вызова со значением приращений обратного вызова 42. С # это значение на 1 и возвращает его на C++, который, в свою очередь, возвращает его на C# на сайт вызова .

Unity не нравится, когда вы пытаетесь получить доступ к движку за пределами основного потока, поэтому я не уверен, что произойдет, если ваша C++ DLL имеет асинхронные обратные вызовы на C#. В моем примере вызовы начинаются в потоке основного единства, поэтому проблем нет. Я бы предположил, что вы не допускаете каких-либо уникальных функций Unity в обратном вызове C#, вместо этого используйте обратный вызов для установки логического (или некоторого другого механизма), который будет использоваться Update для реализации того, что вы хотите от движка Unity.

Смежные вопросы